python - 如何在“响应后”处理程序中确定端点?
问题描述
我正在 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.
解决方案
要获取内部原始请求的端点,@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
推荐阅读
- macos - 打开控制台应用程序以显示统一日志记录日志
- python - 如何使用 Python 3.7 和 Anaconda 运行 Spyder
- python - OpenCv 和 TensorFlow AttributeError:模块“cv2.dnn”没有属性“readNetFromTensorFlow”
- php - 警告:MyCompany\CmsBundle\Controller\DocumentDuplicateController::__construct 缺少参数 1
- android - 在 iOS 和 Android 中使用亚马逊设备消息(推送通知服务)
- c# - 在不同的空隙中填充结构列表
- tcp - HA 代理 TCP 与原始主机名的平衡
- bash - 如何在 bash 中链接多个字符串操作命令?
- sql - 带参数的 Visual FoxPro 查询
- windows - awk 附加 /32 在 MS Windows 中不起作用