@Kirill-Gorelov
С ума с IT

FastApi StaticFiles не работает?

Нужно отрендерить шаблон. Это я сделал, но стили, которые нужно подключить не подключаются.

Делаю по докам.
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

.....

base_dir = os.path.dirname(os.path.abspath(__file__))
app.mount("/sql_app", StaticFiles(directory=base_dir+"/static"), name="sql_app")
templates = Jinja2Templates(directory=base_dir)


Вот структура проекта
636b49cfccf5d495443391.png

Все что бы я не подключаю в html(разные варианты, не один не работает)
{{ url_for('sql_app', path='/styles.css') }}
{{ url_for('sql_app', path='/static/styles.css') }}


636b4a4648c30206118548.png

Пробовал разные варианты подключения вообще никак.
  • Вопрос задан
  • 1128 просмотров
Решения вопроса 1
drygdryg
@drygdryg
Python-разработчик
app.mount("/sql_app", StaticFiles(directory=base_dir+"/static"), name="sql_app")

Во-первых, никогда не соединяйте пути к файлам с помощью конкатенации: это может вызвать проблемы с безопасностью. Используйте для этого os.path.join():
app.mount("/sql_app", StaticFiles(directory=os.path.join(base_dir, "/static")), name="sql_app")

Во-вторых, нужно указать только путь к директории "static" относительно файла main.py, не указывая директорию с проектом (base_dir). Достаточно указать directory="static":
app.mount("/sql_app", StaticFiles(directory="static"), name="sql_app")
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Wispik
@Wispik
Давно была похожая проблема, на stackoverflow нашел решение, что нужно раздачу статики и апи делать отдельно.
Вот пример, из моего кода. Здесь без jinja2, но суть та же
app = FastAPI()
app_api = FastAPI()

app.mount("/api", app_api)
app.mount("/", StaticFiles(directory="static", html=True), name="static")

@app.get('/', response_class=HTMLResponse)
async def main_page():
    return HTMLResponse('index.html')


@app_api.post('/login', response_class=JSONResponse)
async def login(
    username: str = Body(...),
    password: str = Body(...)
):
    ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы