Как обслуживать файлы stati c в FastAPI - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь обслуживать файлы stati c, которые у меня есть в каталоге package_docs. Когда я открываю в браузере:

http://127.0.0.1: 8001 / packages / docs / index. html, страница работает.

Но я хочу откройте страницу: http://127.0.0.1: 8001 / packages / docs /

без исходного файла. Результат будет 404 Not Found

app.mount("/packages/docs", 
    StaticFiles(directory=pkg_resources.resource_filename(__name__, 'package_docs')
    ), 
    name="package_docs")

@app.get("/packages/docs/.*", include_in_schema=False)
def root():
    return HTMLResponse(pkg_resources.resource_string(__name__, "package_docs/index.html"))


app.include_router(static.router)
app.include_router(jamcam.router, prefix="/api/v1/cams", tags=["jamcam"])

Как я могу изменить свой код? Любые советы будут полезны. Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 16 июля 2020

Вам нужно использовать FastAPI TemplateResponse (на самом деле Starlette):

from fastapi import Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

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

templates = Jinja2Templates(directory="package_docs")

@app.get("/items/{id}")
async def example(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

Request как часть пар ключ-значение в контексте для Jinja2. Итак, вы также должны объявить его как параметр запроса. и вам нужно указать файл html, который вы хотите отобразить с помощью Jinja ("your.html", {"request": request})

Также, чтобы напрямую вернуть HTMLResponse, вы можете использовать HTMLResponse from fastapi.responses

from fastapi.responses import HTMLResponse

@app.get("/items/", response_class=HTMLResponse)
async def read_items():
    return """
    <html>
        <head>
            <title></title>
        </head>
        <body>
        </body>
    </html>

Подробнее о настраиваемом ответе можно узнать из Пользовательские ответы FastAPI

0 голосов
/ 18 июня 2020

Из docs

Первый «/ stati c» относится к подпутью, на котором будет «смонтировано» это «вспомогательное приложение». Таким образом, любой путь, начинающийся с «/ stati c», будет обработан им.

Это означает, что вы монтируете свой каталог в http://127.0.0.1: 8001 / packages / docs / , но тогда вам нужно либо указать файл в URL-адресе, либо добавить обработчик, как вы это сделали. Однако проблема заключается в том, что, поскольку вы сначала смонтировали путь, он не будет принимать во внимание следующие пути, которые включают часть пути.

Можно сначала указать путь для http://127.0.0.1 : 8001 / packages / docs / , чтобы он обрабатывался fastapi, а затем монтировать папку, обслуживая файлы stati c.

Кроме того, я бы перенаправлял пользователей, запрашивающих http://127.0.0.1: 8001 / packages / docs / до http://127.0.0.1: 8001 / packages / docs / index. html

...