Flask中使用非唯一处理器名称构建URL
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
我不知道你是怎么处理所有通过同一个模块路由的视图的。
我通常会把我的视图分开放在不同的模块里(就像你用模块 A
和 B
做的那样),然后把它们注册为蓝图。这样,当你使用 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
访问。