如何在Python Tornado中检查请求是否完成?
我的Tornado应用程序中有两个类 第一个类是如何在Python Tornado中检查请求是否完成?,python,python-3.x,tornado,Python,Python 3.x,Tornado,我的Tornado应用程序中有两个类 第一个类是BaseRequestHandler,它扩展了tornado.web.RequestHandler,并重写了它的prepare()方法,用于对所有传入请求进行API密钥验证 第二个是路由特定类ChildRequestHandler,它扩展了BaseRequestHandler ChildRequestHandler还有一个prepare()方法,该方法执行一些参数验证,但在此之前它调用BaseRequestHandler的prepare()方法 现
BaseRequestHandler
,它扩展了tornado.web.RequestHandler
,并重写了它的prepare()
方法,用于对所有传入请求进行API密钥验证
第二个是路由特定类ChildRequestHandler
,它扩展了BaseRequestHandler
ChildRequestHandler
还有一个prepare()
方法,该方法执行一些参数验证,但在此之前它调用BaseRequestHandler的prepare()
方法
现在,如果验证失败,两个类的prepare()
方法调用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')
儿童班
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(),调用两次,因为子类的prepare()
方法也会执行,而不管基类的验证结果如何
这可以通过从基类的prepare()
方法返回布尔值来解决,以确定验证是否通过,然后相应地允许执行子类的prepare()
方法
但是是否有类似于self.finished()
的方法来标识请求是否已经完成?我检查了文档,没有找到任何这样的方法。没有公共的finished()
方法(尽管没有理由不能添加)。我建议提升一个子类tornado.web.HTTPError
,而不是直接调用write\u error
,这样prepare()
在产生错误后不会正常返回 没有公共的finished()
方法(尽管没有理由不能添加)。我建议提升一个子类tornado.web.HTTPError
,而不是直接调用write\u error
,这样prepare()
在产生错误后不会正常返回 哦,是的。。。我怎么会错过这个!!非常感谢。现在,我提出了HTTPError
,并覆盖了write\u error
方法来发送application/json
响应。哦,是的。。。我怎么会错过这个!!非常感谢。现在,我提出了HTTPError
,并重写了write\u error
方法来发送application/json
响应。