前情回顧:寫個網站吧! --Flask+Vue.js+MySQL+Docker(1)--簡介
總結:後端好像也沒啥要講的
先說說使用的技術棧:
Flask,FLask-Restful,Flask-SQLalchemy, Flask-Cors, Python-dotenv, Pymysql
目錄
BUG
1. 第一個就是虛擬環境的問題。
因爲我是使用的Pycharm, 虛擬環境之類的配置非常簡單, 但是封裝docker的時候我想,都是用docker了還有必要使用虛擬環境麼,Pipenv自身也是有缺陷的,反而是使用pip+requirements的方法更直接點:
pip freeze >requirements.txt
pip install -r requirements.txt
有同學有質疑的話也可以交流討論噢。
2. 接下來是服務器的問題,我們使用指令flask run運行時,因爲使用了python-dotenv擴展,我們可以直接讀取.env或者.flaskenv中的配置,但是生產環境中我這次使用的是gunicorn,所以在運行時無法讀取.env中的配置,最後直接寫在了文件中,由於我對docker的瞭解還不是很深,所以我不知道docker的安全性對這個包容性怎麼樣。
以後會尋求更好解決的方法。
3. 最後是werkzeug的0.15.5版本中出現的一個BUG,問題如下:
c:\repos\flask-examples\.venv\scripts\python.exe: Error while finding module specification
解決方法也很簡單,降低一下版本就好。
werkzeug = "==0.15.4"
未來werkzeug會修復這個問題,所以這個BUG是暫時的,不用太多在意。
4. 關於pymysql,之前一個項目使用會報錯,需要下載一個C的包,這次因爲我部署在一個簡單的docker容器,所以這個包不能在基於alpine的容器裏運行。所以這次我把這個包直接刪掉了,結果是並沒有發生什麼錯誤。
可能是BUG修復了?
總之還是使用:
SQLALCHEMY_DATABASE_URI = 'mysql+mysqlclient://。。。'
架構
直接上圖:
由於是非常簡單的CRUD業務,所以也沒有過多使用一些架構,雖然flask推薦使用包(init)我也只是簡單建了個文件夾就開始使用。
主要有一個簡單的模型,其他的文件都放在了app.py中。
這樣做的好處就是對於小項目寫起來簡單,嗯,就這一個好處。
所以大家還是不要學我了。。。
App.py
因爲使用了擴展來解決跨域問題,所以要記得用CORS(app)。
app = Flask(__name__)
api = Api(app)
CORS(app, supports_credentials=True)
關於表單驗證,這裏也放一個簡單的實例:
resource_fields = {
'id': fields.Integer,
'date': fields.String,
'name': fields.String,
'project': fields.String
}
@marshal_with(resource_fields)
def get(self):
project_data = Projects.query.all()
return project_data
後端因爲這次設計的非常簡單,確實也沒有使用到太多的東西,包括認證和一些flask-restful的高級功能也沒有做(因爲實在是懶)。
未來的事,更多的還是在Flask製作API上多學習一下,有條件開始學習一下grapgql。