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?
我用以下解决方案解决了这个问题。
只需命名您的句柄函数(端点)即可,该名称通常可以被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中重复命名,就不会报错。