【问题标题】:How to determine endpoint in "after response" handler?如何在“响应后”处理程序中确定端点?
【发布时间】: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/…

标签: python flask werkzeug


【解决方案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

【讨论】:

  • after_this_response 似乎不存在——只有after_this_request,它添加了一个临时的after_request 处理程序,并且在返回浏览器之前仍然运行。但是,有一个 response.call_on_close 装饰器可以完成这项工作,并且可以与 copy_current_request_context 配对。
  • 我应该更仔细地阅读该方法的来源。无论如何,我找到了一种更简单的方法来做到这一点,而无需创建新的中间件:stackoverflow.com/a/63080968/78903
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 2022-11-23
  • 2020-04-03
  • 1970-01-01
  • 2013-01-02
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多