首页 > 解决方案 > 如何在“响应后”处理程序中确定端点?

问题描述

我正在 Flask 中开发一个 REST API。处理响应后,一些端点需要执行额外的职责,但我想避免使用外部处理队列或线程。一个非常方便的解决方案似乎是使用 WSGI 中间件和 ClosingIterator,如this answer中所述。然而,每个点的处理程序需要知道哪个端点处理了请求,以便执行他们的事后职责。

一个想法是像这样装饰我的端点:

@app.route('/api/status/info', methods=['GET'])
def get_status_info():
    @app.after_this_response('get_status_info')
    def say_hi():
        print('hi, unknown endpoint!')

    return 'ok', 200

而不是unknown endpoint我想打印get_status_info. 这可能吗?

更好的是,如果我编写一个通用@app.after_response处理程序(如同一作者的另一个答案),我可以在其中确定哪个端点用于处理请求吗?

编辑:尝试使用flask.request.url_rule.endpoint会引发异常:

RuntimeError: Working outside of request context.

标签: pythonflaskwerkzeug

解决方案


要获取内部原始请求的端点,@app.after_this_response您可以执行以下操作:

@app.route('/api/status/info', methods=['GET'])
def get_status_info():

    @app.after_this_response('get_status_info')
    @flask.copy_current_request_context
    def say_hi():
        print('hi, %s', % (flask.request.url_rule.endpoint))

    return 'ok', 200

flask.request.url_rule.endpoint为您提供端点的名称,但是默认情况下,当它传递给say_hi函数时,您会丢失请求上下文,这就是您需要@copy_current_request_context装饰器传递上下文的原因。对该装饰器的引用在这里:http: //flask.pocoo.org/docs/1.0/api/#flask.copy_current_request_context


推荐阅读