Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何为tornado编写中间件?_Python 2.7_Tornado_Middleware - Fatal编程技术网

Python 2.7 如何为tornado编写中间件?

Python 2.7 如何为tornado编写中间件?,python-2.7,tornado,middleware,Python 2.7,Tornado,Middleware,在我的tornado应用程序中,对处理程序的每个请求都需要在处理请求之前检查并验证密钥。 如何在Tornado中创建一个中间件类,在if处理请求之前检查并验证密钥 我的中间件类函数看起来像这样 class Checker(object): def process_request(self, request): try: key = request.META['HTTP_X_KEY'] except KeyError:

在我的tornado应用程序中,对处理程序的每个请求都需要在处理请求之前检查并验证密钥。 如何在Tornado中创建一个中间件类,在if处理请求之前检查并验证密钥

我的中间件类函数看起来像这样

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)

可以使用decorator:

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):
      ...

可以使用decorator:

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):
      ...

实际上,您可以连接中间件。HTTPServer请求处理程序只是可调用的对象(函数、方法或实现
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu调用
的对象)。您可以编写自己的处理程序,将请求传递给应用程序:

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请求处理可以是异步的,所以您不能修改中间件中的响应,但至少可以处理请求。

实际上,您可以连接中间件。HTTPServer请求处理程序只是可调用的对象(函数、方法或实现
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu调用
的对象)。您可以编写自己的处理程序,将请求传递给应用程序:

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请求处理可以是异步的,因此您不能修改中间件中的响应,但至少可以处理请求。

当您需要处理所有请求时,装饰器方法没有多大帮助当您需要处理所有请求时,装饰器方法没有多大帮助