我的Tornado应用程序中有两个类。
第一类是BaseRequestHandler
,它扩展了tornado.web.RequestHandler
,并覆盖了它的prepare()
方法,用于所有传入请求的API密钥验证。
第二个是路由特定的类ChildRequestHandler
,它扩展了BaseRequestHandler
。
ChildRequestHandler
还具有prepare()
方法,该方法执行一些参数验证,但在此之前它调用prepare()
的{{1}}方法。
现在,如果验证失败,则两个类的BaseRequestHandler
方法都将调用prepare()
的{{1}}方法。
以下是这两个类的示例。
基本类
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()
的东西来标识请求是否已经完成?我检查了文档,找不到任何这样的方法。
答案 0 :(得分:2)
没有公开的finished()
方法(尽管没有理由不能添加该方法)。我建议引发tornado.web.HTTPError
的子类,而不是直接调用write_error
,以使prepare()
在产生错误后不会正常返回。