Как определить конечную точку в обработчике «после ответа»? - PullRequest
0 голосов
/ 07 февраля 2019

Я разрабатываю REST API во Flask.Некоторые конечные точки должны выполнять дополнительные обязанности после обработки ответа, но я бы хотел избежать использования внешней очереди обработки или потоков.Как представляется, одним из очень удобных решений является использование промежуточного программного обеспечения 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

Вместо unknown endpoint я хотел бы напечатать get_status_info.Возможно ли это?

Еще лучше, если я напишу общий обработчик @app.after_response (как в другой ответ того же автора), могу ли я определить, какая конечная точка использовалась для обработкизапрос?

РЕДАКТИРОВАТЬ: При попытке использовать flask.request.url_rule.endpoint выдает исключение:

RuntimeError: Working outside of request context.

1 Ответ

0 голосов
/ 08 февраля 2019

Чтобы получить конечную точку исходного запроса внутри @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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...