繁体   English   中英

FastAPI Post 请求未呈现 jinja2 模板

[英]FastAPI Post request is not rendering jinja2 template

我已经完成了 post 调用并呈现了 login_form.html 的 jinja2 模板

main.py

from fastapi import FastAPI, Response, status, HTTPException, Depends
import hashlib
from fastapi import APIRouter, Form
from pydantic import BaseModel
from fastapi.staticfiles import StaticFiles
from fastapi import Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()

templates = Jinja2Templates(directory="templates")


@app.post("/",response_class=HTMLResponse)
async def login_form(
    request: Request, uname: str = Form(...), passcode: str = Form(...)
):
    print(uname, passcode)
    return templates.TemplateResponse(
        "auth/login_form.html", {"request": request,"result": "res"}
    )

login_form.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Login Form</title>
    </head>
<body>
<h1>Login Form</h1>
<form method="post">
<h5>Username</h5>
<input type="text" name="uname" placeholder="username"></input>
<h5>Password</h5>
<input name="passcode" placeholder="password" type="text"></input>
<input type="submit"></input>
</form>

<p>{{result}}</p>
</body>
</html>

当我在 web 浏览器上加载页面时,我得到:

{"detail":"Method Not Allowed"}

载入网页

如果您希望它在浏览器中工作,您很可能必须将login_form()设置为GET端点。

如果您已经看到使用带有 FastAPI 的POST的示例,那可能是因为那是用于构建 API 而不是 web 应用程序(也许Starlette是您真正想要的)。

这是适合在浏览器中工作的解决方案(使用 FastAPI):

from fastapi import FastAPI, Query, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()

templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
async def login_form(
    request: Request,
    uname: str = Query(...),     # uname and passcode are mandatory
    passcode: str = Query(...),  # query parameters now
):
    print(uname, passcode)
    return templates.TemplateResponse(
        "auth/login_form.html", {"request": request, "result": "res"}
    )

它呈现如下:

在此处输入图像描述

但是,这可能不是您所需要的。 我假设您想要呈现表单而不需要unamepasscode ,在这种情况下,您可能应该从端点中删除 arguments 。

您需要两条路线,首先获取模板然后发布 @app.get("/") @app.post("/")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM