如果我有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本身并没有在这里看到冲突,因为函数在两个独立的模块中,但是烧瓶确实如此。有没有更好的标准在这里使用,或者我必须使函数名称如def getModuleA
?
答案 0 :(得分:2)
您可以考虑使用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
答案 1 :(得分:1)
你可以在你的路线中使用一个变量,如果您的应用程序不需要模块化,这是一个更简单的解决方案:
@app.route('/module/<name>')
def get(name):
if name == 'a':
return "a"
else:
return "b"
否则,如果您想拥有相同的url端点但需要使用不同的应用程序功能,则需要使用blueprints。在这两个文件中,导入蓝图。
from flask import Blueprint
<强> moduleA.py 强>
moduleA = Blueprint('moduleA', __name__,
template_folder='templates')
@moduleA.route('/moduleA/get')
def get():
return "a"
<强> moduleB.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)