Nested Blueprints in Flask?

后端 未结 3 1132
囚心锁ツ
囚心锁ツ 2020-12-09 17:54

I\'m still new to Flask, so there may be an obvious way to accomplish this, but I haven\'t been able to figure it out so far from the documentation. My app is divided into s

3条回答
  •  清歌不尽
    2020-12-09 18:36

    Here is my workaround:

    When importing a blueprint, I define my nested routes:

    app.register_blueprint(product_endpoints, url_prefix='/sites//menus//categories//products/')
    app.register_blueprint(category_endpoints, url_prefix='/sites//menus//categories/')
    app.register_blueprint(menu_endpoints, url_prefix='/sites//menus/')
    app.register_blueprint(site_endpoints, url_prefix='/sites/')
    

    And inside the blueprints, I'm reusing route parse functions. For example, in the product_endpoints file:

    from category_endpoints import get_category_data
    
    product_endpoints = Blueprint('product_endpoints', __name__)
    
    @product_endpoints.url_value_preprocessor
    def get_product_data(endpoint, values):
        if 'category_id' in values:
            get_category_data(endpoint, values)
    
        product = Product.get_by_id(int(values.pop('product_id')))
    
        if not product:
            abort(404)
    
        g.product = product
    

    and in category_endpoints file:

    from menu_endpoints import get_menu_data
    
    category_endpoints = Blueprint('category_endpoints', __name__)
    
    @category_endpoints.url_value_preprocessor
    def get_category_data(endpoint, values):
        if 'menu_id' in values:
            get_menu_data(endpoint, values)
        category = ProductCategory.get_by_id(int(values.pop('category_id')))
    
        if not category:
            abort(404)
    
        g.category = category
    

    etc... With that approach, my blueprint is also usable with direct routes like /products/.

    This approach worked for me very well. I hope it can also help you.

提交回复
热议问题