我的flask应用程序目前由一个test.py文件组成,该文件包含多条路由,并定义了main()路由。是否有某种方法可以创建一个test2.py文件,其中包含test.py中未处理的路由?

@app.route('/somepath')
def somehandler():
    # Handler code here

我担心在test.py中有太多的路由,我想让它这样我可以运行python test.py,它也将在test.py中获取路由,就好像它是同一文件的一部分一样。我必须在test.py和/或test2.py中进行哪些更改才能使其工作?


当前回答

这项任务可以在没有蓝图和使用集中式URL映射的复杂导入的情况下完成

app.py

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)

views.py

from flask import render_template

def index():
    return render_template('index.html')

def other():
    return render_template('other.html')

其他回答

如果你需要分割蓝图来分离文件,你可以使用snippet:

# app.py

from blueprint_module import blueprint

app = Flask(__name__)
app.register_blueprint(blueprint)
# blueprint_module\__init__.py

from flask import Blueprint

blueprint = Blueprint('my_blueprint', __name__)

from . import page
# blueprint_module\page.py

from . import blueprint

@blueprint.route("/url", methods=['GET'])
def hello():
  return 'hello world'

这项任务可以在没有蓝图和使用集中式URL映射的复杂导入的情况下完成

app.py

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)

views.py

from flask import render_template

def index():
    return render_template('index.html')

def other():
    return render_template('other.html')

你可以使用简单的技巧,即从另一个文件中导入flask app变量,如:

test_routes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

在你的主文件中,在你声明flask app的地方,导入test-routes,像这样:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test_routes

它在我这边起作用。

将应用划分成蓝图是个好主意。然而,如果这还不够,如果你想把Blueprint本身分成多个py文件,也可以使用常规的Python模块导入系统,然后循环遍历从其他文件导入的所有路由。

我用代码创建了一个Gist:

https://gist.github.com/Jaza/61f879f577bc9d06029e

据我所知,这是目前唯一可行的划分蓝图的方法。在Flask中创建“子蓝图”是不可能的,尽管关于这个问题有很多讨论:

https://github.com/mitsuhiko/flask/issues/593

此外,即使这是可能的(这可能是可以做到的,从问题线程的一些片段),子蓝图可能对你的用例限制太大了——例如,如果你不希望一个子模块中的所有路由都有相同的URL子前缀。

我想推荐GitHub上的flask-empty。

它提供了一种简单的方法来理解蓝图、多个视图和扩展。