導語:前段時間學習狗書的flask大型項目框架結構的時候有點混亂,到如今也知道是個啥了,想着,把關係理一理,寫一篇博客。也方便後來學習的人查閱。如下是我建立項目時候的結構。python
myprojectshell
---->app 項目文件夾數據庫
---->static 靜態資源flask
---->templates 網頁模板app
---->main 項目主文件文件夾框架
---->__init__.py 項目主文件初始化 學習
---->views.py 項目視圖測試
---->errors.py 項目錯誤網頁視圖url
---->forms.py 項目表單文件spa
---->models 項目數據庫
---->emails 項目郵箱
---->__init__.py 項目初始化信息
---->config.py 項目配置文件
---->manage.py 項目管理文件
根據本身喜愛能夠自由配置。首先在數據庫中,咱們能夠配置3個config文件,分別用於開發,測試和上線,而後把這三個轉化爲字典結構,便於調用。以下
config = { 'development': DevelopmentConfig, 'testing': TestingConfig, 'production': ProductionConfig, 'default': DevelopmentConfig }
配置信息寫好以後,便開始開發了。因爲結構的問題,使得咱們須要使用藍圖來進行開發。咱們在app/main/__init__中,寫以下代碼
from flask import Blueprint main = Blueprint(「main」,__name__) #"main" 爲這個藍圖的名字 from . import view,error #導入須要用到藍圖的兩個文件
建立好了藍圖以後,咱們還須要在app/__init__中完成對藍圖的註冊,代碼以下:
from app.main import main as main_blueprint app.register_blueprint(main_blueprint)
看到app,是否是有人就很好奇了,這個app是怎麼來的啊,其實就跟咱們之前寫的同樣,狗書上用工廠模式在這個__init__中,不只用於註冊,還用於調用配置信息和初始化第三方擴展。完整代碼以下:
from flask import Flask, render_template from flask.ext.mail import Mail mail = Mail() def create_app(config_name): app = Flask(__name__) #初始化flask app.config.from_object(config[config_name]) #config_name就是配置信息的那個字典 config[config_name].init_app(app) 調用配置信息的初始化環境的靜態方法 mail.init_app(app) 第三方擴展初始化 #這裏寫的是上方的代碼,用於藍圖註冊 return app
建立好了藍圖以後怎麼用呢?在app/main/views中,咱們建立路由是這樣,代碼以下:
@main.route("/") def index(): return redirect(url_for("main.路由名字"))
上面的代碼寫好了以後,咱們須要的就是運行了,爲此在manage.py中代碼以下:
import os from app import create_app, db from app.models import User, Role #導入數據庫的兩個模型 from flask.ext.script import Manager, Shell #導入flask_script from flask.ext.migrate import Migrate, MigrateCommand #導入flask_migrate app = create_app(os.getenv('FLASK_CONFIG') or 'default') manager = Manager(app) migrate = Migrate(app, db) def make_shell_context(): return dict(app=app, db=db, User=User, Role=Role) manager.add_command("shell", #避免重複導入數據庫模型 Shell(make_context=make_shell_context)) manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run()