Как перенаправить 404 в другой шаблон с помощью aiohttp? - PullRequest
0 голосов
/ 08 марта 2020

Я хотел бы добиться этой функции: если в таблице маршрутов (404) нет подходящих результатов, то перенаправьте ее, чтобы отобразить пользовательский шаблон 404. Есть ли способ реализации в aiohttp? спасибо

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Это описано в руководстве по промежуточному программному обеспечению: http://demos.aiohttp.org/en/latest/tutorial.html#middlewares

Я только что предложил некоторые улучшения этого кода, поэтому вот мой улучшенный подход:

import aiohttp_jinja2
from aiohttp import web


async def handle_404(request):
    return aiohttp_jinja2.render_template('404.html', request, {})


async def handle_500(request):
    return aiohttp_jinja2.render_template('500.html', request, {})


def create_error_middleware(overrides):
    @web.middleware
    async def error_middleware(request, handler):
        try:
            return await handler(request)
        except web.HTTPException as ex:
            override = overrides.get(ex.status)
            if override:
                resp = await override(request)
                resp.set_status(ex.status)
                return resp

            raise
        except:
            resp = await overrides[500](request)
            resp.set_status(500)
            return resp

    return error_middleware


def setup_middlewares(app):
    error_middleware = create_error_middleware({
        404: handle_404,
        500: handle_500
    })
    app.middlewares.append(error_middleware)
0 голосов
/ 13 марта 2020

Промежуточное программное обеспечение не вызывается без сопоставления маршрутизатора.

Это может быть сделано с настраиваемым маршрутизатором

from aiohttp import web, web_urldispatcher


class Router(web.UrlDispatcher):
    async def resolve(self, request):
        res = await super().resolve(request)

        if isinstance(res,web_urldispatcher.MatchInfoError):
            if res.http_exception.status == 404:
                return web_urldispatcher.MatchInfoError(
                    web.HTTPNotFound(
                        text="<html><body>custom 404</body></html>",
                        content_type="text/html")
                    )

        return res

routes = web.RouteTableDef()

@routes.get('/')
async def hello(request):
    return web.Response(text="Hello, world")

app = web.Application(router= Router())
app.add_routes(routes)
web.run_app(app)

Я думаю, что лучший способ - написать настраиваемое Resource, но это не очень хорошо документированы.

...