【问题标题】:How to divide flask app into multiple py files?如何将flask app分成多个py文件?
【发布时间】:2012-08-16 19:43:25
【问题描述】:

我的烧瓶应用程序当前包含一个带有多个路由的 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 中进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: python flask


    【解决方案1】:

    您可以使用通常的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

    【讨论】:

    • 除了那个蓝图的 init 之外,我们如何才能在文件中拥有蓝图路由?
    • 如果我想使用 JWT 创建一个安全的端点,那么如何在每个 route.py 文件中做到这一点
    【解决方案2】:

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

    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
    

    它在我身边有效。

    【讨论】:

    • 只是一个例子,__main__指的是你的入口文件,就是这样!
    • 太棒了,非常感谢。上面的蓝图或封装方法对于小型应用程序来说太过分了。
    • 这里是解释此方法的文档的链接:https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
    • @nimeresam 它对我有用,但我必须知道import test-routes 不能位于app.py 文件的顶部。它使 gunicorn 崩溃,但是在将导入移动到文件底部之后,它就起作用了。 " 只是确保模块已导入,我们在文件底部执行此操作"
    • 循环依赖看起来不太好。 stackoverflow.com/a/60441931/6419007 恕我直言要好得多。它也很简单,但更干净。
    【解决方案3】:

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

    【讨论】:

    • 太好了,谢谢。
    • 在列出的将 app.py 拆分为多个文件的可能性中,我发现这种方法是最简单和最直接的。值得一提的是,如果从flask中导入request和session,可以在views.py中访问request详情和session。
    【解决方案4】:

    我想在 GitHub 上推荐 flask-empty

    它提供了一种简单的方法来理解Blueprints、多个视图和extensions

    【讨论】:

      【解决方案5】:

      如果您需要拆分蓝图来分隔文件,您可以使用 sn-p:

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

      【讨论】:

      • 注意:在blueprint_module/__init__.py中添加文字
      • 这让我想起了很多关于 Express for node 建议如何组织服务路由的问题。很好的答案。
      【解决方案6】:

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

      我用代码创建了一个要点:

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

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

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

      此外,即使有可能(并且使用该问题线程中的一些 sn-ps 可能是可行的),无论如何,子蓝图对于您的用例可能过于限制 - 例如如果您不希望子模块中的所有路由都具有相同的 URL 子前缀。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-08
        • 2014-11-23
        • 1970-01-01
        • 2021-10-16
        • 2016-12-12
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        相关资源
        最近更新 更多