我是Flask的新手,目前可以将现有的WSGI应用程序转换为通过Flask运行,因为从长远来看,它将使生活更加轻松。
所有请求都是针对特定路由的POST,但是当前应用程序会在执行路由之前检查发布数据,以查看是否需要运行该请求(即,发布数据中提供的标识符是否已经存在于我们的路由中)数据库)。
如果确实存在200代码,则json将“早”返回,并且不执行其他任何操作;如果没有,应用程序将继续正常路由。
我认为我可以通过调用before_request()在适当的位置复制活动,但是我不确定从before_request()返回烧瓶响应对象是否会在该点充分终止请求?还是有更好的方法呢?
注意:我必须将其返回为200-我看到的其他示例会导致重定向或4xx错误处理(因为与此活动非常接近的是身份验证),所以最终我在before_request的结尾进行了此操作():
if check_request_in_progress(post_data) is True:
response = jsonify({'request_status': 'already_running'})
response.status_code = 200
return response
else:
add_to_requests_in_progress(post_data)
这项工作(退回并阻止进一步路由)是否可以?
如果没有,如何在调用before_request()之后阻止进一步的路由?
有更好的方法吗?
答案 0 :(得分:1)
根据他们在文档中所说的内容,它应该执行您想要的操作。
将在不带任何参数的情况下调用该函数。如果该函数返回一个非值,则将其视为来自视图的返回值,并停止进一步的请求处理。 (source)
@app.route("/<name>")
def index(name):
return f"hello {name}"
@app.before_request
def thing():
if "john" in request.path:
return "before ran"
使用以上代码,如果url_path
中有一个“ john”,我们将在输出中看到before ran
,而不是实际的预期视图。您将看到hello X
的其他字符串。
因此,是的,使用before_request
并返回内容,除了None
以外的任何内容都将阻止flask服务您实际的view
。您可以redirect
用户或向他们发送正确的回复。