aiohttp中间件并更新请求的URL

时间:2018-06-21 05:24:01

标签: python middleware aiohttp

我正在寻找正在使用的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()

有什么想法吗?感谢您的帮助。

1 个答案:

答案 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