在烧瓶中重定向后返回自定义的http代码

时间:2020-07-09 17:23:37

标签: python http flask httpresponse

我是烧瓶的新手。 场景: 提交表单后,我试图重定向到特定路线。 因此,我为此使用了烧瓶重定向以及代码参数。

@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,然后重定向到预期的路由。 但是,如果我这样做,它只会返回一个重定向页面。每次需要手动单击时。 Redirection page

是否有任何变通方法来返回201代码并自动重定向? 预先感谢!

1 个答案:

答案 0 :(得分:5)

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

这不是您可以使用HTTP进行的操作。重定向本身就是specific HTTP 30x status code

在HTTP中,重定向是由服务器向请求发送特殊的 redirect 响应触发的。重定向响应具有以3开头的status codes和一个包含要重定向到的URL的Location标头。

返回201状态代码,或者返回HTTP重定向状态代码之一。你不能两者都做。

flask.redirect()函数生成有效的30x响应(带有必需的Location标头),而documentation for the function指出支持哪些重定向状态代码:

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

该函数不强制执行此操作;状态代码未通过验证。

您需要在此处区分浏览器和其他客户端。 201创建的响应通常是您从REST API返回给客户端的东西,该客户端期望在可编程级别进行简单的JSON或XML交互。另一方面,重定向通常在表示层的前端中使用。

如果您要编码基于HTML的前端,则只需返回重定向。人类不读取响应代码,而是读取呈现的HTML页面。他们不在乎,也不需要知道用于使浏览器执行正确操作的确切HTTP代码。鉴于您的路线还包含 form ,因此几乎可以肯定,您将为人类而不是为程序化客户建立网站。

如果您要构建REST API,请返回201响应,并记录API客户端必须基于您包含的Location标头或主体中的内容进行新请求。响应。但是,HTML浏览器不会在201响应中遵循Location标头。

然后,即使它允许您使用redirect()作为状态代码,我也不会使用201函数,因为它始终会生成一个(简单的)HTML正文,其中包含您要输入的文本在浏览器中查看有关自动重定向的信息。