【问题标题】:FastAPI: Retrieve the endpoint for jinja2 `url_for` to give a jump linkFastAPI:检索 jinja2 `url_for` 的端点以提供跳转链接
【发布时间】:2021-02-16 15:16:03
【问题描述】:

功能说明

在烧瓶中这段代码:

@app.route('/')
def index():
    return ...

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

app.register_blueprint(foo_router, url_prefix='/api')

这些方法可以让您使用url_for('index') 来检索像https://hostname:8080/ 这样的网址

或使用url_for('foo.index') 来检索像https://hostname:8080/api/foo 这样的网址

所需功能

使用url_for 作为fastapi 中的跳转链接,例如flask

附加上下文

我发现了一个技巧来做这个工具

创建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'),
])

并在您的main.py 中添加

from .url_naming import foo_router_for

app.add_route('/foo', foo_router_for, name='foo_area.index')

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

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

【问题讨论】:

    标签: python python-3.x jinja2 fastapi


    【解决方案1】:

    我用下面的方法解决了这个问题。

    只是为你的句柄函数(端点)命名,该名称可以被url_for正常使用。

    router = APIRouter(prefix='/api')
    
    @router.get('/foo')
    async def api_foo():
        return ...
    

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

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

    【讨论】:

    • 非常感谢。但是你是怎么知道的——>“这是因为 FastAPI 中的所有句柄函数都在同一个空间中命名”。文档中是否提到了这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多