FastAPI重定向给出方法不允许的错误

2 篇文章 0 订阅
2 篇文章 0 订阅

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 Jinja2Templates

app = 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
有友友知道这是因为什么吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值