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

dea*_*mon 17 python url wsgi url-routing flask

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

模块A有一个处理程序index:

@app.route('/')
def index(): pass
Run Code Online (Sandbox Code Playgroud)

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

@app.route('/anotherindex')
def index(): pass
Run Code Online (Sandbox Code Playgroud)

如何区分index构建URL时调用的处理程序?

url_for('index')
Run Code Online (Sandbox Code Playgroud)

mde*_*ous 50

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

我最常做的是在不同的模块分开我的观点(像你这样用模块AB),并注册为蓝图,在此之后,使用时url_for()的功能,你可以用你的蓝图名称前缀视图名称,然后避免冲突和潜在的问题.

这是一个例子:

main_views.py:

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

@main.route('/')
def index():
    pass
Run Code Online (Sandbox Code Playgroud)

admin_views.py:

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

@admin.route('/admin')
def index():
    pass
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

现在,要访问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
Run Code Online (Sandbox Code Playgroud)

application.py:

from flask import Flask
from admin_views import admin

app = Flask('my_application')
app.register_blueprint(admin, url_prefix='/admin')
Run Code Online (Sandbox Code Playgroud)

这两个视图将在URL /admin//admin/logout