如何确定 "after response" 处理程序中的端点?

How to determine endpoint in "after response" handler?

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

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

@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.

要在 @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