我是烧瓶的新手。 场景: 提交表单后,我试图重定向到特定路线。 因此,我为此使用了烧瓶重定向以及代码参数。
@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代码并自动重定向? 预先感谢!
答案 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正文,其中包含您要输入的文本在浏览器中查看有关自动重定向的信息。