【发布时间】:2019-02-06 21:26:49
【问题描述】:
我正在 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
我想打印get_status_info,而不是unknown endpoint。这可能吗?
更好的是,如果我编写一个通用的@app.after_response 处理程序(如同一作者在another answer 中所写),我可以在其中确定哪个端点用于处理请求吗?
编辑:尝试使用flask.request.url_rule.endpoint 会引发异常:
RuntimeError: Working outside of request context.
【问题讨论】:
-
我首先想到的是一些类似守护进程的线程。你考虑过这个吗?
-
flask.request.url_rule.endpoint能满足您的需求吗? -
@SirNeuman 我已经编辑了答案 - 不幸的是它在请求上下文之外不起作用。
-
@gonczor 我希望它可以避免线程(我已经编辑了答案以反映这一点,谢谢!)。 WSGI 中间件的解决方案实际上非常适合我的需要,我只需要能够将参数传递给我的处理程序(我几乎可以肯定可以以某种方式完成,但我的 WSGI-foo 缺少:))。
-
@johndodo 如果它在请求上下文之外,您可以将
@copy_current_request_context装饰器添加到您的say_hi函数中吗? flask.pocoo.org/docs/1.0/api/…