我正在寻找正在使用的aiohttp中间件的帮助,如果缺少,它将自动在uri中添加斜杠。 Aiohttp要求在定义URL时,必须为路由列表中的每个路径定义两条路由,一条带有斜杠,另一条没有斜杠。他们有一个示例中间件,该中间件通过查找uri是否不以/
结尾并添加否的方式来解决此问题,但是他们使用http 302重定向告诉客户端转到新uri。否则,像/endpoint
这样的相对uri会404,而/endpoint/
会起作用。
这是他们的中间件:
https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_middlewares.py
以他们的中间件为基础,我试图完成同样的事情,但是在客户端没有重定向。我希望处理仅在服务器上进行。我目前对此的尝试如下所示,似乎正在更新飞行中的请求,但我仍然收到404:
from aiohttp.web_urldispatcher import SystemRoute
def middleware(f):
f.__middleware_version__ = 1
return f
def trailing_slashes():
@middleware
async def impl(request, handler):
if isinstance(request.match_info.route, SystemRoute):
rel_url = str(request.rel_url)
if '?' in rel_url:
path, query = rel_url.split('?', 1)
query = f'?{query}'
else:
path = rel_url
query = ''
if not path.endswith('/'):
rel_url = f'{path}/{query}'
request = request.clone(rel_url=rel_url)
return await handler(request)
return impl
这是一个实现中间件并说明问题的类。
from aiohttp import web
import slashes_mw
class ClassName(object):
def __init__(self):
self.app = web.Application(middlewares=[slashes_mw.trailing_slashes()])
self.app.add_routes(self.get_routes())
web.run_app(self.app, port=80, host='0.0.0.0')
def get_routes(self):
return [
web.get('/', self.handler),
web.get('/{name}/', self.handler)
]
def handler(self, request):
return web.Response(text='hello')
ClassName()
有什么想法吗?感谢您的帮助。
答案 0 :(得分:0)
我认为他们提出的重定向方法非常正确,因为路由根本不一样。但是您也可以尝试仅注册路线的第二个“版本”:
def get_routes(self):
return [
web.get('/', self.handler),
web.get('/{name}/', self.handler),
web.get('/{name}', self.handler)
]
这应该在服务器端处理您的问题(未测试)。
据我了解框架,您的方法行不通,因为在调用不同的中间件之前已选择了特定处理程序。如果您在中间件中调用处理程序函数,则不会再进行“路由”查找。或者至少这就是我对他们的文档的理解方式:https://docs.aiohttp.org/en/stable/web_advanced.html#middlewares
也可能很有趣:https://docs.aiohttp.org/en/stable/web_quickstart.html#variable-resources