首页 > 解决方案 > 如何使用 aiohttp 将 404 重定向到另一个模板?

问题描述

我想实现这个功能:如果路由表(404)中没有相关结果,则将其重定向以呈现定制的404模板。aiohttp有什么实现方式吗?谢谢

标签: pythonroutesaiohttp

解决方案


这在中间件下的教程中有所介绍: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)

推荐阅读