Как проверить, завершен ли запрос в Python Tornado? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть два класса в приложении Tornado.

Первый класс - BaseRequestHandler, который расширяет tornado.web.RequestHandler и переопределяет prepare() его метод для проверки API-ключа всех входящих запросов.

Второй - это специфический для маршрута класс ChildRequestHandler, который расширяет BaseRequestHandler.

ChildRequestHandler также имеет метод prepare(), который выполняет проверку некоторых параметров, но перед этим он вызывает prepare() метод BaseRequestHandler.

Теперь, prepare() метод обоих классов вызывает finish() методы tornado.web.RequestHandler, если проверка не пройдена.

Ниже приведены примеры обоих классов.

Базовый класс

class BaseRequestHandler(RequestHandler):
    # Override Write Error method
    def write_error(self, status_code, chunk):
        self.set_status(status_code)
        self.finish({'message': chunk})

    # Prepare method to validate API Key
    def prepare(self):
        # Send Unauthorized error
        if 'X-API-KEY' not in self.request.headers:
            self.write_error(401, 'API Key {X-API-KEY} Required')
            return None

        # Set API Key from header
        self.apikey = self.request.headers['X-API-KEY']

Дочерний класс

class ChildRequestHandler(BaseRequestHandler):

    # Check for required parameters
    def prepare(self):
        # Call Prepare of base class
        super(ChildRequestHandler, self).prepare()

        username = self.get_query_argument('username', None)
        if username is None:
            self.write_error(400, 'Username {username} Required')

Проблема возникает при сбое проверки в Базовом классе.Затем он выдает ошибку времени выполнения finish() called twice, так как метод prepare() дочернего класса также выполняется независимо от результата проверки базового класса.

Это можно решить, возвращая логический метод из prepare() метода базового класса для идентификациипрошла ли валидация или нет и, соответственно, разрешает ли выполнение метода prepare() дочернего класса.

Но есть ли что-то вроде self.finished(), чтобы определить, завершен ли запрос?Я проверил документацию и не смог найти такой метод.

1 Ответ

0 голосов
/ 10 октября 2018

Нет общедоступного finished() метода (хотя нет причин, по которым его нельзя добавить).Я рекомендую повышать подкласс tornado.web.HTTPError вместо прямого вызова write_error, чтобы prepare() не возвращался нормально после выдачи ошибки.

...