我的龙卷风应用程序中有两个类。
第一个类是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()
来确定请求是否已完成?我检查了文档,找不到任何这样的方法。
没有公共finished()
方法(尽管没有理由不能添加一个(。我建议引发tornado.web.HTTPError
的子类,而不是直接调用write_error
,这样prepare()
在产生错误后就不会正常返回。