FastAPI:检索jinja2`url_for`的端点以给出跳转链接

iyu*_*ume 4 python jinja2 python-3.x fastapi

功能说明

在烧瓶中这段代码:

@app.route('/')
def index():
    return ...
Run Code Online (Sandbox Code Playgroud)

或者

foo_router = Blueprint('foo', __name__)
@foo_router.route('/')
def index():
    return ...

app.register_blueprint(foo_router, url_prefix='/api')
Run Code Online (Sandbox Code Playgroud)

您可以使用这些方式url_for('index')来检索 url,例如https://hostname:8080/

或用于url_for('foo.index')检索 url,例如https://hostname:8080/api/foo

所需功能

用于类似url_for的跳转链接fastapiflask

额外的背景信息

我找到了一个实现该工具的技巧

创建url_naming.py并添加以下代码

from starlette.routing import Mount, Route

from .routers.foo.endpoints.area import index as foo_area_index

foo_router_for = Mount('/', routes=[
    Route('/area', foo_area_index, name='foo_area.index'),
])
Run Code Online (Sandbox Code Playgroud)

并在你的main.py添加中

from .url_naming import foo_router_for

app.add_route('/foo', foo_router_for, name='foo_area.index')
Run Code Online (Sandbox Code Playgroud)

在代码块中,我定义了name两次,因为name我在Route模型中定义的内容无法被FastAPI检测到,或者被FastAPI覆盖,并且这个impl没有任何意义,因为它需要写下真实的路由器名称而不是端点函数名称。

尽管如此,如果我想在一个文件中命名我的路由器,但该文件对 不起作用,该怎么办main.py

iyu*_*ume 7

我用以下解决方案解决了这个问题。

只需命名您的句柄函数(端点)即可,该名称通常可以被url_for.

router = APIRouter(prefix='/api')

@router.get('/foo')
async def api_foo():
    return ...
Run Code Online (Sandbox Code Playgroud)

这样您就可以http://hostname:8080/api/foo/使用检索 url url_for('api_foo')

我猜测这是因为FastAPI中所有的句柄函数都在同一个空间命名,如果在FastAPI中重复命名,就不会报错。