我龙卷风应用程序中对处理程序的每个请求都需要在处理请求之前检查并验证密钥。 我怎么能在Tornado中创建一个中间件类,它会在处理请求之前检查并验证密钥?
我的中间件类函数看起来像这样。
class Checker(object):
def process_request(self, request):
try:
key = request.META['HTTP_X_KEY']
except KeyError:
key = None
if key and key == os.environ.get('KEY'):
#Process the request
return None
#Redirect to Home Page
return HttpResponsePermanentRedirect('http://google.com', status=301)
答案 0 :(得分:4)
可以使用装饰器:
from functools import wraps
def check_key(f):
@wraps(f)
def wrapper(self, request):
try:
key = request.META['HTTP_X_KEY']
except KeyError:
key = None
if key and key == os.environ.get('KEY'):
#Process the request
f(self, request)
return None
#Redirect to Home Page
return HttpResponsePermanentRedirect('http://google.com', status=301)
return wrapper
class Checker(object):
@check_key
def process_request(self, request):
...
答案 1 :(得分:0)
实际上你可以连接中间件。 HTTPServer请求处理程序只是可调用对象(实现__call__
的函数,方法或对象)。您可以编写自己的处理程序,将请求传递给您的应用程序:
my_app = tornado.web.Application(...)
def middleware(request):
# do whatever transformation you want here
my_app(request)
if __name__ == '__main__':
http_server = tornado.httpserver.HTTPServer(middleware)
# ...`
由于Tornado请求处理可以是异步的,因此您无法修改中间件中的响应,但您至少可以使用该请求。