如何将烧瓶app分成多个py文件?

时间:2012-08-16 19:43:26

标签: python 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中包含哪些更改才能使其生效?

7 个答案:

答案 0 :(得分:122)

您可以使用通常的Python包结构将您的App划分为多个模块see the Flask docs.

然而,

  

Flask使用蓝图概念来制作应用程序组件,并在应用程序或应用程序中支持常见模式。

您可以在单独的文件中将应用的子组件创建为蓝图:

simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
    # stuff

然后在主要部分使用它:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)

蓝图还可以捆绑特定资源:模板或静态文件。有关所有详细信息,请参阅Flask docs

答案 1 :(得分:15)

我想在GitHub上推荐flask-empty

它提供了一种简便的方式来理解Blueprints,多个视图和extensions

答案 2 :(得分:13)

使用Centralized URL Map

无需蓝图和棘手的导入即可完成此任务

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

答案 3 :(得分:4)

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

我用这个代码创建了一个Gist:

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

据我所知,这是目前划分蓝图的唯一可行方法。它不可能创建&#34;子蓝图&#34;在Flask中,虽然有一个问题,但有很多关于此问题的讨论:

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

此外,即使有可能(并且它可能可以使用该问题线程中的某些片段),但子蓝图可能对您的用例过于严格 - 例如如果您不希望子模块中的所有路由都具有相同的URL子前缀。

答案 4 :(得分:1)

如果您需要拆分蓝图以分隔文件,您可以使用代码段:

app.py

from blueprint_module import blueprint

app = Flask(__name__)
app.register_blueprint(bluepirnt)

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'

答案 5 :(得分:0)

您可以像django一样分割。参见下面的骨架

https://github.com/rohitchormale/cookiecutter-flask

答案 6 :(得分:0)

您可以使用简单的技巧,即从另一个文件内部的main导入flask应用程序变量,例如:

test-routes.py

from __main__ import app

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

在声明烧瓶应用程序的主文件中,导入测试路由,例如:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

它在我这边起作用。