Flask是一個輕便的Web開發(fā)庫召锈,
但隨著API開發(fā)但進行位仁,越來越多的部分被加入到項目中,
為了結構的簡明和日后的可維護性计贰,
更好地組織項目結構勢在必行。
RESTful API項目目錄結構參考
本文仍然聚焦在REST API設計蒂窒,
因此templating等部分不會涉及躁倒。
|--<項目名稱>
|--app/
|--models/
|--resources/
|--tests/
|--venv/
|--requirements.txt
|--config.py
|--run.py
最核心的兩個目錄:
app/
下存放應用程序代碼,
分為模型和資源兩個部分洒琢。
具體可以參考資源類和模型類秧秉。
tests/
下存放單元測試代碼。
開發(fā)環(huán)境的設置:
一個較好的Python開發(fā)習慣是為每個項目建立單獨的虛擬環(huán)境衰抑,
這樣就可以隔離它們之間的Python運行環(huán)境象迎。
在項目目錄下使用virtulenv
:
virtualenv --no-site-packages venv
將會自動創(chuàng)建venv
目錄,
參數(shù)--no-site-packages
強制不將已經安裝到Python系統(tǒng)內的任何第三方包復制過來呛踊,
使得新的venv
完全純凈砾淌。
同時,應該將所有的依賴包歸納入requirements.txt
谭网,
使得任何使用者可以快速地在任何機器上部署相同的開發(fā)環(huán)境:
$ pip install -r requirements.txt
run.py
run.py
用于配置并啟動開發(fā)服務器汪厨。
應該實現(xiàn)的的功能有:
- 創(chuàng)建應用(
app
) - 實例化
flask_restful.Api
- 綁定資源與URI
- 連接數(shù)據(jù)庫
# run.py
from flask import Flask
from flask_restful import Api
# 導入各資源類
from resources.user import User, UserList
from resources.item import Item, ItemList
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
api = Api(app)
@app.before_first_request
def create_tables():
db.create_all()
api.add_resource(User, '/user/<string:name>')
api.add_resource(UserList, '/users')
api.add_resource(Item, '/item/<string:name>')
api.add_resource(ItemList, '/items')
if __name__ == '__main__':
from db import db
db.init_app(app)
app.run(port=5000, debug=True)
綁定資源與URI
在使用Flask-RESTful
輔助開發(fā)時,
由于不再直接綁定URI和視圖函數(shù)蜻底,
而是單獨定義各個資源類骄崩,再綁定資源類與URI,
因此在run.py
中集中進行綁定是一個較好的實踐薄辅。
連接數(shù)據(jù)庫
在模型類中我們使用ORM技術將模型與數(shù)據(jù)庫中的表一一對應要拂,
但ORM并不會自動為我們創(chuàng)建數(shù)據(jù)庫,
如果試圖連接并不存在的數(shù)據(jù)庫顯然會產生ERROR站楚。
為了創(chuàng)建初始數(shù)據(jù)庫以供鏈接脱惰,
可以使用:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
db.create_all()
將其放入單獨的腳本,在API應用啟動前運行創(chuàng)建數(shù)據(jù)庫即可窿春。
但還有一個更好的方法:
app.before_first_request
裝飾器允許我們定義一個函數(shù)拉一,
并且這個函數(shù)將在第一個請求到來之前運行采盒。
因此
@app.before_first_request
def create_tables():
db.create_all()
可以完美替代額外的腳本,簡化了流程蔚润。