不需要应用程序singleton的aiohttp@route decorator
aiohttp_route_decorator的Python项目详细描述
aiohttp_route_decorator
库为aiohttp.web提供了@routedecorator,类似于Flask@app.route的契约。
虚构的aiohttp@app.routedecorator是multiplereasons的discouraged;这一个试图解决这些问题的一部分(至少app不需要是全局的)。
安装
pip install aiohttp_route_decorator
用法
在每个处理程序模块中创建一个route对象,并装饰处理程序:
# myapp/handlers.pyfromaiohttp_route_decoratorimportRouteCollectorroute=RouteCollector()@route('/')asyncdefindex(request):returnweb.Response(body=b'OK')@route('/publish',method='POST')asyncdefpublish(request):returnweb.Response(body=b'OK')@route('/login',methods=['GET','POST'],name='login')asyncdeflogin(request):ifrequest.method=='POST':returnweb.Response(body=b'OK')returnweb.Response(body=b'Login')
初始化应用程序时,将收集的routes推入app.router:
fromaiohttpimportwebfrommyappimporthandlersdefrun():app=web.Application()handlers.route.add_to_router(app.router)web.run_app(app)
非装饰性使用
如果您希望保持您的路线在一起,您可以在handers之后手动构建列表:
fromaiohttp_route_decoratorimportRouteCollector,Routeasyncdefindex(request):returnweb.Response(body=b'OK')asyncdefpublish(request):returnweb.Response(body=b'OK')asyncdeflogin(request):ifrequest.method=='POST':returnweb.Response(body=b'OK')returnweb.Response(body=b'Login')routes=RouteCollector([Route('/',index),Route('/publish',publish,method='POST'),Route('/login',login,methods=['GET','POST'],name='login'),])
前缀路由
您可以提供所有路由前面的公用路由前缀:
fromaiohttp_route_decoratorimportRouteCollectorroutes=RouteCollector(prefix='/app')@route('/')asyncdefindex(request):returnweb.Response(body=b'OK')@route('/publish',method='POST')asyncdefpublish(request):returnweb.Response(body=b'OK')...handlers.route.add_to_router(app.router)# /app/ -> index# /app/publish -> publish
您也可以在add_to_router()调用中提供前缀:
fromaiohttp_route_decoratorimportRouteCollectorroutes=RouteCollector()@route('/')asyncdefindex(request):returnweb.Response(body=b'OK')@route('/publish',method='POST')asyncdefpublish(request):returnweb.Response(body=b'OK')...handlers.route.add_to_router(app.router,prefix='/app')# /app/ -> index# /app/publish -> publish
…或同时使用:
fromaiohttp_route_decoratorimportRouteCollectorroutes=RouteCollector(prefix='/app')@route('/')asyncdefindex(request):returnweb.Response(body=b'OK')@route('/publish',method='POST')asyncdefpublish(request):returnweb.Response(body=b'OK')...handlers.route.add_to_router(app.router,prefix='/project')# /project/app/ -> index# /project/app/publish -> publish
RouteCollector的非装饰版本也可以接受前缀:
fromaiohttp_route_decoratorimportRouteCollector,Routeasyncdefindex(request):returnweb.Response(body=b'OK')asyncdefpublish(request):returnweb.Response(body=b'OK')routes=RouteCollector(prefix='/app',routes=[Route('/',index),Route('/publish',publish,method='POST'),])
参数参考
route(path, *, method='GET', methods=None, name=None, **kwargs)
- path(str)-路由路径。应该以斜线('/')开头。
- 方法(str)-路由的http方法。对于任何方法,都应该是'GET'、'POST'、'PUT'、'DELETE'、'PATCH'、'HEAD'、'OPTIONS'或'*'之一。
- methods(list[str])-一次创建多个具有不同http方法的路由的可选快捷方式。如果使用,则应为method参数的可接受值列表。
- name(str)-可选路由名。
- kwargs-要传递给aiohttp.web.Resource.add_route()的其他参数。