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

Python 在flask中重定向后返回自定义http代码,python,http,flask,httpresponse,Python,Http,Flask,Httpresponse,我对烧瓶还不熟悉。 情景: 我试图在提交表单后重定向到某个路由。 所以我使用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

我对烧瓶还不熟悉。 情景: 我试图在提交表单后重定向到某个路由。 所以我使用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,然后重定向到预期的路由。 但如果我这样做,它只会返回一个重定向页面。每次我需要手动单击时。

是否有任何方法可以返回201代码并自动重定向? 提前谢谢

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

这不是HTTP所能做到的。重定向本身就是:

在HTTP中,重定向由服务器向请求发送特殊重定向响应来触发。重定向响应以3开头,标题中包含要重定向到的URL

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

flask.redirect函数使用所需的位置标头生成有效的30x响应,并说明支持哪些重定向状态代码:

支持的代码为301、302、303、305、307和308。300不受支持,因为它不是一个真正的重定向,304是因为它是一个请求的答案,该请求的标题为defined If Modified-Since

但是,该函数不强制执行这一点;未验证状态代码

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

如果您正在编写基于HTML的前端,只需返回重定向。人类不读取响应代码,而是读取呈现的HTML页面。他们不在乎,也不需要知道用于让浏览器做正确事情的确切HTTP代码。考虑到您的路线还包括一个表单,您几乎肯定是在为人类而不是编程客户端构建一个站点

如果您正在构建一个RESTAPI,那么返回一个201响应,并记录API客户端必须根据您包含的位置头或响应主体中的某些内容发出新请求。但是,HTML浏览器不会跟随201响应上的位置标题

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

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

这不是HTTP所能做到的。重定向本身就是:

在HTTP中,重定向由服务器向请求发送特殊重定向响应来触发。重定向响应以3开头,标题中包含要重定向到的URL

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

flask.redirect函数使用所需的位置标头生成有效的30x响应,并说明支持哪些重定向状态代码:

支持的代码为301、302、303、305、307和308。300不受支持,因为它不是一个真正的重定向,304是因为它是一个请求的答案,该请求的标题为defined If Modified-Since

但是,该函数不强制执行这一点;未验证状态代码

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

如果您正在编写基于HTML的前端,只需返回重定向。人类不读取响应代码,而是读取呈现的HTML页面。他们不在乎,也不需要知道用于让浏览器做正确事情的确切HTTP代码。考虑到您的路线还包括一个表单,您几乎肯定是在为人类而不是编程客户端构建一个站点

如果您正在构建一个RESTAPI,那么返回一个201响应,并记录API客户端必须根据您包含的位置头或响应主体中的某些内容发出新请求。但是,HTML浏览器不会跟随201响应上的位置标题


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

我想您可能指的是301。HTTP 201不是重定向。@KenKinder:他们的意思是201,但不是r
我想那是不可能的。在这个问题上,他们确实说,他们想发出一个信号,表明已经创建了一个记录;这是创建的状态代码。我想你可能是指301。HTTP 201不是重定向。@KenKinder:他们的意思是201,但没有意识到这是不可能的。在这个问题上,他们确实说,他们想发出一个信号,表明已经创建了一个记录;是已创建的状态代码。