URL building with Flask and non-unique handler names

后端 未结 1 992
梦谈多话
梦谈多话 2020-12-23 10:52

Flask provides a url_for function to generate URLs to handlers based on the URL pattern. But this would imply that the handler functions must have unique names across the en

相关标签:
1条回答
  • 2020-12-23 11:17

    I don't know how you could do with all the views routed by the same module.

    What I usually do is separate my views in different modules (like you did with module A and B), and register them as blueprints, after that, when using the url_for() function, you can prefix the view name with your blueprint name and then avoid conflicts and potential problems.

    Here is an example:

    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)
    

    Now, to access the 2 index views and still distinguish one from the other, just use url_for('main.index') or url_for('admin.index')

    EDIT:

    Just one more useful details about routing using blueprints, when registering the blueprint, you can pass a url_prefix argument, that will apply to every view within this blueprint.

    For example, given the following code:

    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')
    

    The 2 views would be available at the URL /admin/ and /admin/logout

    0 讨论(0)
提交回复
热议问题