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

发布于 2021-01-29 15:09:45

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

模块A有一个处理程序index

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

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

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

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

url_for('index')
关注者
0
被浏览
102
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    我通常要做的是将视图分开放在不同的模块中(就像您对moduleA和进行的操作一样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)
    

    现在,要访问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')
    

    2个视图将在URL/admin//admin/logout



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看