Задать вопрос
@maltsevdm

Как указать начальную директорию для фронтенда в приложении FastAPI?

У меня есть приложение на FastAPI. Структура примерно такая:
app
.... main.py
.... client
........ index.html
........ index.js
........ style.css
........ cfg
............ index.html
............ index.js
............ style.css
........ components
............ libs
................. и т.д.

Файл main.py
app = FastAPI()

app.mount('/client', StaticFiles(directory='client'), name='static')

@app.get('/')
async def get():
    return FileResponse('client/index.html')

@app.get('/cfg')
async def cfg():
    return FileResponse('client/cfg/index.html')


Файл client/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>

    <link href="style.css" rel="stylesheet" type="text/css">

    <script src="libs/d3/d3.v7.js"></script>

    <script src="libs/billboard/billboard.js"></script>
    <link rel="stylesheet" href="libs/billboard/billboard.min.css">
    <link rel="stylesheet" href="libs/billboard/datalab.min.css">

    <link rel="stylesheet" href="libs/datePicker/air-datepicker.css">

    <script src="./index.js" type="module" defer></script>
</head>
<body>

<dash-board></dash-board>

</body>
</html>


Файл client/cfg/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="./index.js" type="module" defer></script>
    <link href="style.css" rel="stylesheet" type="text/css">
    <link href="../libs/codemirror-5.65.13/lib/codemirror.css" rel="stylesheet" type="text/css">
    <link href="../libs/codemirror-5.65.13/addon/hint/show-hint.css" rel="stylesheet" type="text/css">
    <link href="../libs/codemirror-5.65.13/theme/idea.css" rel="stylesheet" type="text/css">

    <link rel="stylesheet" href="../libs/bootstrap/bootstrap.min.css">
    <script src="../libs/bootstrap/bootstrap.min.js"></script>

    <link rel="stylesheet" href="../libs/jsonTree/jsonTree.css">
    <script src="../libs/jsonTree/jsonTree.js"></script>
</head>
<body>
<cfg-main></cfg-main>
</body>
</html>


Когда запускаю приложение и перехожу по пути localhost:8000, на сервер приходят GET-запросы с путями, какие указаны в html файлах.
Пример: "GET /index.js HTTP/1.1" 404 Not Found
Соответственно получаю ошибку, что такой файл не найден, потому что в начале не указана корневая директория "client".
Как мне сделать, чтобы указывалась корневая директория. В самом html файле пути корректировать не вариант.
Я пробовал переадресовывать таким способом:
@app.get('/')
async def get():
    return RedirectResponse('client/index.html')

В таком случае всё загружается и работает нормально. Приходят GET-запросы с указанием корневой директории. Но тогда url меняется url на localhost:8000/client/index.html. Такой способ не подходит.

РЕШЕНИЕ:
Проблему всё-таки решил поменяв в StaticFile путь на "/".
app.mount('/', StaticFiles(directory='client', html=True), name='static')

Но отсюда у меня возникла другая проблема. Мне нужно было устанавливать куки при переходе на страницы. Эту проблему решил через использование middleware.
@app.middleware('http')
async def some_middleware(request: Request, call_next):
    response = await call_next(request)
    response.set_cookie(key=cookie_key, value=cookie_value, max_age=cookie_age)
    return response


Может кому-нибудь пригодится.
  • Вопрос задан
  • 192 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@va_k
Уберите клиент из корня и у вас не будет нужно его указывать.
app.mount('/', StaticFiles(directory='client'), name='static')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

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