从烧瓶中的before_request()返回

时间:2018-08-21 11:07:15

标签: python-3.x flask

我是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()之后阻止进一步的路由?

有更好的方法吗?

1 个答案:

答案 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用户或向他们发送正确的回复。