我正在使用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.
答案 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