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

Rol*_*ndo 117 python flask

我的烧瓶应用程序当前包含一个test.py包含多个路径和main()定义路径的文件.有没有办法我可以创建一个test2.py包含未处理的路由的文件test.py

@app.route('/somepath')
def somehandler():
    # Handler code here
Run Code Online (Sandbox Code Playgroud)

我担心有太多的路由,test.py并且想要使我能够运行python test.py,这也将获取路由,test.py就像它是同一个文件的一部分一样.为了让这个变得有效,我必须做出哪些改变test.py和/或包含test2.py

pix*_*tik 135

您可以使用通常的Python包结构将App划分为多个模块,请参阅Flask文档.

然而,

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

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

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

然后在主要部分使用它:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)
Run Code Online (Sandbox Code Playgroud)

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

  • 我们如何才能在该蓝图的 __init__ 之外的文件中拥有蓝图路由? (2认同)

nim*_*sam 65

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

test_routes.py

from __main__ import app

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

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

应用程序

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test_routes
Run Code Online (Sandbox Code Playgroud)

它从我这边工作。

  • 太棒了,非常感谢。上面的蓝图或打包方法对于小型应用程序来说是多余的。 (8认同)
  • 循环依赖看起来不太好。/sf/answers/4230935201/ 恕我直言要好得多。它也很简单,但更干净。 (8认同)
  • @nimeresam 它对我有用,但我必须知道“导入测试路由”不能位于“app.py”文件的顶部。它使 Gunicorn 崩溃,但将导入移动到文件底部后,它就工作了。_“只是确保模块已导入,我们正在文件的底部执行此操作”_ (4认同)
  • 这只是一个例子,`__main__`指的是你的入口文件,就是这样! (3认同)

小智 25

无需蓝图和使用集中 URL 映射的棘手导入即可完成此任务

应用程序

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)
Run Code Online (Sandbox Code Playgroud)

视图.py

from flask import render_template

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

def other():
    return render_template('other.html')
Run Code Online (Sandbox Code Playgroud)

  • 在列出的将 app.py 拆分为多个文件的可能性中,我发现这种方法是最简单、最直接的。值得一提的是,如果从flask导入请求和会话,则可以在views.py中访问请求详细信息和会话。 (3认同)

Iva*_*hin 16

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

# app.py

from blueprint_module import blueprint

app = Flask(__name__)
app.register_blueprint(blueprint)
Run Code Online (Sandbox Code Playgroud)
# blueprint_module\__init__.py

from flask import Blueprint

blueprint = Blueprint('my_blueprint', __name__)

from . import page
Run Code Online (Sandbox Code Playgroud)
# blueprint_module\page.py

from . import blueprint

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

Run Code Online (Sandbox Code Playgroud)


Jon*_*tes 15

我想在GitHub上推荐使用flask-empty.

它提供了一种理解蓝图,多视图和扩展的简便方法.


Jaz*_*aza 5

将应用程序划分为多个蓝图是一个好主意。但是,如果这还不够,并且您想将蓝图本身分成多个py文件,则可以使用常规的Python模块导入系统,然后遍历从其他文件导入的所有路由来实现。

我使用以下代码创建了一个Gist:

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

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

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

另外,即使有可能(并且可以使用该问题线程中的一些代码片段来实现),子蓝图对于您的用例也可能过于严格-例如,如果您不希望所有路线都在子模块具有相同的URL子前缀。