python aiohttp.web 中间件如何工作
how does python aiohttp.web middleware work
根据文档
The handler passed in to a middleware factory is the handler returned by the next middleware factory. The last middleware factory always receives the request handler selected by the router itself (by UrlDispatcher.resolve()).
我认为 UrlDispatcher.resolve() 将 return 我分配的注册处理程序,所以我编写了这段代码。根据我的理解,当访问页面 127.0.0.1:9000 时,索引处理程序将用作 m1
的处理程序
import logging;
import asyncio
from aiohttp import web
logging.basicConfig(level=logging.INFO)
@asyncio.coroutine
def m1(app,handler):
def log(request):
r = yield from handler(request)
logging.info(str(r))
@asyncio.coroutine
def index(request):
return web.Response(body=b'<h1>Aswesome</h1>')
@asyncio.coroutine
def names(request):
return web.Response(text='<h1>%s</h1>' % request.match_info['name'])
@asyncio.coroutine
def init(loop):
app = web.Application(loop=loop, middlewares=[
m1
])
app.router.add_route('GET','/',index)
app.router.add_route('GET','/{name:\w+}',names)
srv = yield from loop.create_server(app.make_handler(),'127.0.0.1',9000)
logging.info('server started at http://127.0.0.1:9000')
return srv
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
当我 运行 代码并访问 127.0.0.1:9000 的服务器时,我得到了
File "/home/os/Documents/Python/web/lib/python3.5/site-packages/aiohttp/web.py", line 90, in handle_request
resp = yield from handler(request)
TypeError: 'NoneType' object is not callable
在我看来,NoneType 作为处理程序传递到 m1 中间件
您的中间件 returns 什么都没有,但应该返回中间件处理程序 log
。我在您的代码中添加了一行 returns log
.
@asyncio.coroutine
def m1(app,handler):
def log(request):
r = yield from handler(request)
logging.info(str(r))
return log # changed
有关详细信息,请参阅 documentation regarding middlewares。
此外,值得研究一下 Python 3.5,它提供了 async/await
语法来处理可等待对象,也就是协程。 aiohttp
.
的贡献者建议使用语法
根据文档
The handler passed in to a middleware factory is the handler returned by the next middleware factory. The last middleware factory always receives the request handler selected by the router itself (by UrlDispatcher.resolve()).
我认为 UrlDispatcher.resolve() 将 return 我分配的注册处理程序,所以我编写了这段代码。根据我的理解,当访问页面 127.0.0.1:9000 时,索引处理程序将用作 m1
的处理程序import logging;
import asyncio
from aiohttp import web
logging.basicConfig(level=logging.INFO)
@asyncio.coroutine
def m1(app,handler):
def log(request):
r = yield from handler(request)
logging.info(str(r))
@asyncio.coroutine
def index(request):
return web.Response(body=b'<h1>Aswesome</h1>')
@asyncio.coroutine
def names(request):
return web.Response(text='<h1>%s</h1>' % request.match_info['name'])
@asyncio.coroutine
def init(loop):
app = web.Application(loop=loop, middlewares=[
m1
])
app.router.add_route('GET','/',index)
app.router.add_route('GET','/{name:\w+}',names)
srv = yield from loop.create_server(app.make_handler(),'127.0.0.1',9000)
logging.info('server started at http://127.0.0.1:9000')
return srv
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
当我 运行 代码并访问 127.0.0.1:9000 的服务器时,我得到了
File "/home/os/Documents/Python/web/lib/python3.5/site-packages/aiohttp/web.py", line 90, in handle_request
resp = yield from handler(request)
TypeError: 'NoneType' object is not callable
在我看来,NoneType 作为处理程序传递到 m1 中间件
您的中间件 returns 什么都没有,但应该返回中间件处理程序 log
。我在您的代码中添加了一行 returns log
.
@asyncio.coroutine
def m1(app,handler):
def log(request):
r = yield from handler(request)
logging.info(str(r))
return log # changed
有关详细信息,请参阅 documentation regarding middlewares。
此外,值得研究一下 Python 3.5,它提供了 async/await
语法来处理可等待对象,也就是协程。 aiohttp
.