代码之家  ›  专栏  ›  技术社区  ›  Elliot Woods

烧瓶路由到不同模块中具有相同名称的函数

  •  4
  • Elliot Woods  · 技术社区  · 7 年前

    如果我有2个文件,例如:

    moduleA.py

    from MyPackage import app
    
    @app.route('/moduleA/get')
    def get():
        return "a"
    

    moduleB.py

    from MyPackage import app
    
    @app.route('/moduleB/get')
    def get():
        return "b"
    

    并且在 __init__.py

    from flask import Flask
    import IPython
    import logging
    
    app = Flask(__name__,
            static_url_path='', 
            static_folder='static',
            template_folder='templates')
    from MyPackage import moduleA, moduleB
    

    然后烧瓶会抛出一个错误 AssertionError: View function mapping is overwriting an existing endpoint function: get

    我假设python本身在这里没有看到冲突,因为函数在两个独立的模块中,然而flask却看到了。这里有更好的标准吗?还是我必须让函数名像 def getModuleA

    2 回复  |  直到 7 年前
        1
  •  5
  •   Ivan Choo    7 年前

    您可以考虑使用 Blueprint

    对象,初始化几个扩展,并注册 蓝图。

    例子:

    # module_a.py
    from flask import Blueprint
    
    blueprint = Blueprint('module_a', __name__)
    
    @blueprint.route('/get')
    def get():
        return 'a'
    
    # module_b.py
    from flask import Blueprint
    
    blueprint = Blueprint('module_b', __name__)
    
    @blueprint.route('/get')
    def get():
        return 'b'
    
    # app.py
    from flask import Flask
    from module_a import blueprint as blueprint_a
    from module_b import blueprint as blueprint_b
    
    
    app = Flask(__name__)
    app.register_blueprint(blueprint_a, url_prefix='/a')
    app.register_blueprint(blueprint_b, url_prefix='/b')
    
    # serves:
    #  - /a/get
    #  - /b/get
    
        2
  •  1
  •   smundlay    7 年前

    @app.route('/module/<name>')
    def get(name):
       if name == 'a':
          return "a"
       else:
          return "b"
    

    否则,您需要使用 blueprints 如果您希望具有相同的url端点,但用于应用程序的不同功能。在这两个文件中,导入Blueprint。

    from flask import Blueprint
    

    moduleA = Blueprint('moduleA', __name__,
                            template_folder='templates')
    
    @moduleA.route('/moduleA/get')
    def get():
    return "a"
    

    模块B。py公司

    moduleB = Blueprint('moduleB', __name__,
                            template_folder='templates')
    
    @moduleB.route('/moduleB/get')
    def get():
       return "b"
    

    from moduleA import moduleA
    from moduleB import moduleB
    app = Flask(__name__)
    app.register_blueprint(moduleA) #give the correct template & static url paths here too 
    app.register_blueprint(moduleB)