Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在“响应后”处理程序中确定端点?_Python_Flask_Werkzeug - Fatal编程技术网

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

Python 如何在“响应后”处理程序中确定端点?,python,flask,werkzeug,Python,Flask,Werkzeug,我正在烧瓶中开发一个RESTAPI。一些端点需要在处理响应后执行额外的任务,但我希望避免使用外部处理队列或线程。一个非常方便的解决方案似乎是使用WSGI中间件和ClosingIterator,如中所述。但是,每个点的处理程序需要知道哪个端点处理了请求,以便执行其事后职责 一个想法是像这样装饰我的端点: @app.route('/api/status/info', methods=['GET']) def get_status_info(): @app.after_this_respons

我正在烧瓶中开发一个RESTAPI。一些端点需要在处理响应后执行额外的任务,但我希望避免使用外部处理队列或线程。一个非常方便的解决方案似乎是使用WSGI中间件和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
我想打印get_status_信息,而不是未知端点。这可能吗

更好的是,如果我编写了一个通用的@app.after_响应处理程序,就像由同一作者编写的一样,我可以在其中确定哪个端点用于处理请求吗

编辑:尝试使用flask.request.url\u rule.endpoint时引发异常:

RuntimeError: Working outside of request context.

要在@app.in_内获取原始请求的终结点,在该_响应之后,您可以执行以下操作:

@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\u rule.endpoint为您提供了端点的名称,但是在默认情况下,当它传递到say\u hi函数时,您会丢失请求上下文,这就是为什么您需要@copy\u current\u request\u context decorator传递上下文的原因。这里提到了那个装饰师:

我首先想到的是一些类似daeomn的线程。你考虑过这个问题吗?flask.request.url\u rule.endpoint能满足你的需要吗?@SirNeuman我已经编辑了答案-不幸的是,它在请求上下文之外不起作用。@gonczor我更喜欢它,我可以避免线程,我已经编辑了答案以反映这一点,谢谢!。使用WSGI中间件的解决方案实际上非常适合我的需要,我只需要能够将参数传递给我的处理程序,我几乎确信可以以某种方式完成,但我的WSGI foo缺少:。@johndoo如果它在请求上下文之外,您能否将@copy\u current\u request\u上下文装饰器添加到say\u hi函数中?after_此_响应似乎不存在-仅在after_此_请求之后,它添加了一个临时after_请求处理程序,并在返回浏览器之前仍然运行。但是,有一个response.call\u on\u close decorator可以执行此任务,并且可以与copy\u current\u request\u context配对。我应该仔细阅读该方法的来源。无论如何,我找到了一种更简单的方法来实现这一点,而无需创建新的中间件: