The library provides @route
decorator for aiohttp.web, resembling the contract of Flask @app.route
.
The imaginary aiohttp
@app.route
decorator is discouraged for multiple reasons; this one tries to solve part of those problems (the app
doesn't need to be global at the very least).
This package was created for older aiohttp releases. As of aiohttp 2.3, there is built-in RouteTableDef class which works pretty much the same way.
pip install aiohttp_route_decorator
Create a route
object in each of your handler modules, and decorate the handlers:
# myapp/handlers.py
from aiohttp_route_decorator import RouteCollector
route = RouteCollector()
@route('/')
async def index(request):
return web.Response(body=b'OK')
@route('/publish', method='POST')
async def publish(request):
return web.Response(body=b'OK')
@route('/login', methods=['GET', 'POST'], name='login')
async def login(request):
if request.method == 'POST':
return web.Response(body=b'OK')
return web.Response(body=b'Login')
When you init the application, push the collected routes
into app.router
:
from aiohttp import web
from myapp import handlers
def run():
app = web.Application()
handlers.route.add_to_router(app.router)
web.run_app(app)
If you prefer to keep your routes together, you can construct the list manually after your handers:
from aiohttp_route_decorator import RouteCollector, Route
async def index(request):
return web.Response(body=b'OK')
async def publish(request):
return web.Response(body=b'OK')
async def login(request):
if request.method == 'POST':
return web.Response(body=b'OK')
return web.Response(body=b'Login')
routes = RouteCollector([
Route('/', index),
Route('/publish', publish, method='POST'),
Route('/login', login, methods=['GET', 'POST'], name='login'),
])
You can provide common route prefix that will be prepended to all routes:
from aiohttp_route_decorator import RouteCollector
routes = RouteCollector(prefix='/app')
@route('/')
async def index(request):
return web.Response(body=b'OK')
@route('/publish', method='POST')
async def publish(request):
return web.Response(body=b'OK')
...
handlers.route.add_to_router(app.router)
# /app/ -> index
# /app/publish -> publish
You can also provide the prefix within add_to_router()
call instead:
from aiohttp_route_decorator import RouteCollector
routes = RouteCollector()
@route('/')
async def index(request):
return web.Response(body=b'OK')
@route('/publish', method='POST')
async def publish(request):
return web.Response(body=b'OK')
...
handlers.route.add_to_router(app.router, prefix='/app')
# /app/ -> index
# /app/publish -> publish
...or use both:
from aiohttp_route_decorator import RouteCollector
routes = RouteCollector(prefix='/app')
@route('/')
async def index(request):
return web.Response(body=b'OK')
@route('/publish', method='POST')
async def publish(request):
return web.Response(body=b'OK')
...
handlers.route.add_to_router(app.router, prefix='/project')
# /project/app/ -> index
# /project/app/publish -> publish
The non-decorator version of RouteCollector
can also accept prefix:
from aiohttp_route_decorator import RouteCollector, Route
async def index(request):
return web.Response(body=b'OK')
async def publish(request):
return web.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) — route path. Should be started with slash (
'/'
). - method (str) — HTTP method for route. Should be one of
'GET'
,'POST'
,'PUT'
,'DELETE'
,'PATCH'
,'HEAD'
,'OPTIONS'
or'*'
for any method. - methods (List[str]) — optional shortcut for creating several routes with different HTTP methods at once. If used, should be a list of acceptable values for
method
argument. - name (str) — optional route name.
- kwargs — other parameters to be passed to
aiohttp.web.Resource.add_route()
.