小能豆

在 Flask 中重定向后返回自定义 http 代码

py

我是 flask 的新手。场景:我试图在提交表单后重定向到某个路由。因此,我为此使用了 flask 重定向以及代码参数。

@topics_bp.route('/create_topic/',methods =['GET','POST'] )
def create_topic():
    if request.method == 'GET':
        #send the form for create topic!
        formData = TopicForm()
        return render_template('create-topic.html',form = formData)
    if request.method == 'POST':
        # check the post method and redirect

        return redirect(url_for('topic.topics'),code=201)

基本上,我希望为创建的记录返回 HTTP 代码 201,然后重定向到预期的路由。但如果我这样做,它只会返回重定向页面。每次我都需要手动点击。

1.png

有什么解决方法可以返回 201 代码并自动重定向?提前致谢!


阅读 15

收藏
2025-01-09

共1个答案

小能豆

我想为创建的记录返回 HTTP 代码 201,然后重定向到预期的路由。

这不是 HTTP 可以实现的功能。重定向本身就是一个特定的 HTTP 30x 状态代码

在 HTTP 中,重定向由服务器向请求发送特殊的重定向响应触发。重定向响应具有以 开头的状态代码3,以及Location包含要重定向到的 URL 的标头。

您要么返回 201 状态代码要么返回 HTTP 重定向状态代码之一。您不能同时执行这两项操作。

flask.redirect()函数生成有效的 30x 响应(带有所需的Location标头),并且该函数的文档说明了支持哪些重定向状态代码:

支持的代码为 301、302、303、305、307 和 308。不支持 300,因为它不是真正的重定向;不支持 304,因为它是带有定义的 If-Modified-Since 标头的请求的答复。

但是,该功能并不强制执行这一点;状态代码未经验证。

您需要在这里区分浏览器和其他客户端。201 Created 响应通常是从 REST API 返回给需要以可编程级别进行简单 JSON 或 XML 交互的客户端的。另一方面,重定向通常用于表示层的前端。

如果您正在编写基于 HTML 的前端,只需返回重定向。人类不会阅读响应代码,他们只会阅读渲染的 HTML 页面。他们不关心也不需要知道用于使浏览器执行正确操作的确切 HTTP 代码。鉴于您的路线还包括一个表单,您几乎肯定是在为人类而不是为程序化客户构建网站。

如果您正在构建 REST API,则返回 201 响应,并记录 API 客户端必须根据Location您包含的标头或响应正文中的某些内容发出新请求。Location但是,HTML 浏览器不会遵循 201 响应的标头。

然后,我不会redirect()为此使用该函数,即使它允许您将其用作201状态代码,因为它总是生成一个(简单的)HTML 正文,其中包含您在浏览器中看到的有关自动重定向的文本。

2025-01-09