如何确定“响应后”处理程序中的端点?

时间:2019-02-06 21:26:50

标签: python flask werkzeug

我正在使用Flask开发REST API。处理响应后,某些端点需要执行其他职责,但是我想避免使用外部处理队列或线程。一种非常方便的解决方案似乎是使用this answer中概述的WSGI Middleware和ClosingIterator。但是,每个点的处理程序都需要知道哪个端点处理了该请求,以便执行其验尸职责。

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

@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处理程序(如同一作者的another answer一样),是否可以确定在其中使用了哪个端点来处理请求?

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

RuntimeError: Working outside of request context.

1 个答案:

答案 0 :(得分:1)

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