使用Flask和非唯一处理程序名称构建URL

时间:2011-08-05 13:51:53

标签: python url url-routing wsgi flask

Flask提供了url_for功能,可根据网址格式为处理程序生成网址。但这意味着处理程序函数必须在整个应用程序中具有唯一的名称。这是对的吗?

示例

模块A有一个处理程序index

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

模块B有另一个处理程序index

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

如何在构建网址时区分名为index的处理程序?

url_for('index')

1 个答案:

答案 0 :(得分:50)

我不知道如何处理同一模块路由的所有视图。

我通常做的是在不同模块中分隔我的观点(就像你对模块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)

现在,要访问2个索引视图并仍然区分其中一个,只需使用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')

可在网址/admin//admin/logout

中找到2个观看次数