Flask項目結構
來自專欄影蹤禪院Python Monk
定義
先讓大家明確一些術語,方便後面的討論。
- 倉庫/版本庫 - 應用程序所在的基礎文件夾。習慣上指笨笨控制系統。在文章中提到時,指的是項目的根目錄。
- 包 - 指應用代碼的一個Python包。
- 模塊 - 一個模塊指能被其他的Python文件導入的一個Python文件。一個包基本上是打包在一起的多個模塊。
常用擴展(Extensions)
Flask作為微框架(microframework),在開發過程中會經常使用各種擴展包。以下是一些常用擴展包的簡介。
- Flask-SQLAlchemy - 封裝了SQLAlchemy,提供ORM
- Flask-Migrate - 處理SQLAlchemy資料庫的遷移(migrations)
- Flask-Script - 支持在Flask里編寫額外的腳本
- Flask-Bootstrap - 封裝了Bootstrap框架
- Flask-Login - 提供賬號session管理
- Flask-WTF - 封裝了WTForms,提供表單功能
- Flask-RESTful - 提供快速構建RESTAPIs的能力
目錄結構
一般Flask的項目結構如下:
├── README.md├── app│ ├── __init__.py│ ├── api│ │ ├── __init__.py│ │ └── views.py│ ├── auth│ │ ├── __init__.py│ │ ├── forms.py│ │ ├── templates│ │ │ └── auth.html│ │ └── views.py│ ├── extensions.py│ ├── forms.py│ ├── main│ │ ├── __init__.py│ │ ├── errors.py│ │ ├── models.py│ │ ├── templates│ │ │ └── index.html│ │ └── views.py│ └── models.py├── config.py├── fabfile.py├── manage.py├── migrations├── requirements│ ├── common.txt│ ├── dev.txt│ └── prod.txt└── unit_tests
- README.md - 倉庫的說明,比如該項目的介紹等
- app - 項目的主要功能實現
- config.py - 項目的配置
- fabfile.py - 使用Fabric3完成項目發布工作的腳本
- manage.py - 基於Flask-Script擴展的命令行腳本
- requirements - 該項目所依賴的第三方包
- unit_tests - 單元測試相關代碼
組織藍圖
目前主要有兩種組織方式:
- 按照 功能結構 組織。模板在一個文件夾中,靜態文件在另外一個文件夾中,視圖在第三個文件夾中。
- 按照 分區 組織。同一個功能的模板,靜態文件,視圖都在一個文件夾內。
兩種組織方式的優劣並無定論,選擇自己喜歡的就好。筆者傾向於按照分區組織,上文中的代碼也是按照分區進行組織的。比如api、auth、main三個模塊。
將RESTful-api註冊為藍圖
當你使用前後端分離的架構方式時,可考慮如下的方式進行組織(以上文的api文件夾為例):
api/views.py
# coding: utf-8from flask_restful import Api, Resourceapi = Api()@api.resource(/tmp_api)class TmpApiResource(Resource): def get(self): pass
api/__init__.py
# coding: utf-8from flask import Blueprintapi_bp = Blueprint(api_bp, __name__)from .views import apiapi.init_app(api_bp)
最後將api_bp註冊到app上,跟其他藍圖保持一致。
組織擴展(Extensions)
一般推薦將所有擴展在app/extensions.py中進行實例化,如以下代碼:
app/extensions.py
# coding: utf-8from flask_bootstrap import Bootstrapfrom flask_sqlalchemy import SQLAlchemyfrom flask_login import LoginManagerbootstrap = Bootstrap()db = SQLAlchemy()login_manager = LoginManager()login_manager.login_view = auth_bp.login
然後在實例化Flask時,進行綁定:
app/__init__.py
# coding: utf-8import osfrom flask import Flaskfrom config import configfrom app.extensions import bootstrap, db, login_managerdef create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) config[config_name].init_app(app) bootstrap.init_app(app) db.init_app(app) login_manager.init_app(app) # register blueprint from .main import main_bp app.register_blueprint(main_bp) from .auth import auth_bp as auth_blueprint app.register_blueprint(auth_blueprint) from .api import api_bp as api_blueprint app.register_blueprint(api_blueprint, url_prefix=/api) return app
推薦閱讀: