У меня есть два класса в приложении 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()
, чтобы определить, завершен ли запрос?Я проверил документацию и не смог найти такой метод.