Fastapi渲染页面模板:
设置一个列表,放置待处理事项:
template = Jinja2Templates("pages")todos = ["写日记", "看电影", "玩游戏"]
设置循环体,对列表进行展示
<body><h1>代办事项</h1>{% for todo in todos %}<p>{{ todo }}</p>{% endfor %}
</body>
设置待办事项输入框
<!-- 待办事项输入框 --><div><!-- 将信息放入form表单中,action表示数据传输的位置 --><form action="/todo" method="post"><input name="todo" placeholder="请添加待办事项..."><input type="submit" value="添加"></form></div>
在fastapi中处理POST方法时出现问题:
POST请求设置部分:
@app.post("/todo")
def todo(todo=Form(None)):# 处理用户发送过来的 todolist 数据todos.insert(0, todo)return RedirectResponse("/")
在这里显示为POST请求不被允许
解决方案:
共尝试三种方法,只有一种有效:
第一种方法:设置methods参数
app.add_middleware(CORSMiddleware,allow_methods=["POST", "GET"])
第二种方法:设置api_route对应的值
@app.api_route("/todo", methods=("POST", "GET", "PUT"))
def todo(todo=Form(None)):# 处理用户发送过来的 todolist 数据todos.insert(0, todo)return RedirectResponse("/")
第三种:将status_code的值修改为302
@app.post("/todo")
def todo(todo=Form(None)):# 处理用户发送过来的 todolist 数据todos.insert(0, todo)return RedirectResponse("/", status_code=302)
目前第三种方法成功
成品:
添加后
这是因为在重定向过程中向"/todo“发出了POST请求,从而导致了错误。
在FastAPI中,starlette响应的默认代码是307,它在重定向期间保留了方法,因此产生了post请求。可以通过在返回响应之前添加response.status_code = 302解决了这个问题。
但是在另外两种方法进行试验时出现了一个问题
点击添加时出现错误,出现方法不允许
但是点击返回操作至还未点击添加的页面时,进行刷新会发现,成功的添加上去了
这个时候已经成功的添加进去了
完整代码
import uvicorn
from fastapi import FastAPI, Request, Form
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templatesapp = FastAPI()
template = Jinja2Templates("pages")todos = ["写日记", "看电影", "玩游戏"]@app.get("/")
def index(req: Request):return template.TemplateResponse("index.html",context={"request": req,"todos": todos})@app.api_route("/todo", methods=("POST", "GET", "PUT"))
def todo(todo=Form(None)):# 处理用户发送过来的 todolist 数据todos.insert(0, todo)return RedirectResponse("/")if __name__ == '__main__':uvicorn.run(app, host="127.0.0.1", port=8000)
参考资料:https://cloud.tencent.com/developer/ask/sof/817013
有友友知道这是因为什么吗?