[英]How to divide flask app into multiple py files?
我的 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
進行哪些更改才能使其工作?
您可以使用通常的 Python 包結構將您的應用程序划分為多個模塊,請參閱 Flask 文檔。
然而,
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 文檔。
您可以使用簡單的技巧,即從另一個文件中的 main 導入flask app 變量,例如:
test_routes.py
from __main__ import app
@app.route('/test', methods=['GET'])
def test():
return 'it works!'
並在您聲明flask應用程序的主文件中,導入測試路由,例如:
應用程序
from flask import Flask, request, abort
app = Flask(__name__)
# import declared routes
import test_routes
它從我這邊工作。
無需藍圖和使用集中 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)
視圖.py
from flask import render_template
def index():
return render_template('index.html')
def other():
return render_template('other.html')
我想在 GitHub 上推薦flask-empty 。
將應用程序划分為藍圖是一個好主意。 但是,如果這還不夠,並且如果您想將藍圖本身分成多個 py 文件,這也可以使用常規 Python 模塊導入系統,然后循環從其他文件導入的所有路由.
我用這樣做的代碼創建了一個要點:
https://gist.github.com/Jaza/61f879f577bc9d06029e
據我所知,這是目前划分藍圖的唯一可行方法。 在 Flask 中創建“子藍圖”是不可能的,盡管有一個問題有很多關於這個的討論:
https://github.com/mitsuhiko/flask/issues/593
此外,即使有可能(並且它可能可以使用該問題線程中的一些片段),但是子藍圖對於您的用例來說可能過於嚴格 - 例如,如果您不希望所有路線都在一個子模塊具有相同的 URL 子前綴。
如果您需要拆分藍圖來分隔文件,您可以使用代碼段:
# 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'
您可以像django一樣分割。 見下面的骨架
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.