Flask中使用非唯一处理器名称构建URL

18 投票
1 回答
4850 浏览
提问于 2025-04-16 22:58

Flask 提供了一个叫做 url_for 的功能,可以根据 URL 的模式生成链接。不过,这就意味着在整个应用中,处理函数的名字必须是唯一的,对吗?

举个例子

模块 A 有一个处理函数叫 index

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

而模块 B 也有一个处理函数叫 index

@app.route('/anotherindex')
def index(): pass

那么在生成链接的时候,怎么区分这两个叫 index 的处理函数呢?

url_for('index')

1 个回答

52

我不知道你是怎么处理所有通过同一个模块路由的视图的。

我通常会把我的视图分开放在不同的模块里(就像你用模块 AB 做的那样),然后把它们注册为蓝图。这样,当你使用 url_for() 函数时,可以在视图名称前加上蓝图名称,这样就能避免冲突和潜在的问题。

这里有个例子:

main_views.py:

from flask import Blueprint
main = Blueprint('main', __name__)

@main.route('/')
def index():
    pass

admin_views.py:

from flask import Blueprint
admin = Blueprint('admin', __name__)

@admin.route('/admin')
def index():
    pass

application.py:

from flask import Flask
from main_views import main
from admin_views import admin

app = Flask('my_application')
app.register_blueprint(main)
app.register_blueprint(admin)

现在,要访问这两个索引视图并区分它们,只需使用 url_for('main.index')url_for('admin.index')

编辑:

还有一个关于使用蓝图路由的有用细节,当你注册蓝图时,可以传递一个 url_prefix 参数,这个参数会应用到这个蓝图中的每个视图。

例如,给出以下代码:

admin_views.py

from flask import Blueprint
admin = Blueprint('admin', __name__)

@admin.route('/')
def index():
    pass

@admin.route('/logout')
def logout():
    pass

application.py:

from flask import Flask
from admin_views import admin

app = Flask('my_application')
app.register_blueprint(admin, url_prefix='/admin')

这两个视图将可以通过 URL /admin//admin/logout 访问。

撰写回答