導語
-
flask非常靈活,也非常難以駕馭,如何把flask同日常使用的功能結合起來,是需要考慮的問題,這裏提供了一些方案
- 完整的docker+docker-compose+ci/cd流程 一鍵部署熱更新代碼到雲主機
- flask cli 通過FlaskGroup來管理所有commands,運行腳本
- flask factory模式 結合celery 創建異步任務隊列
- flask+redis 配置緩存
- 自動從.env文件加載配置
- flask 每次加載自動刷新js和css文件,提高開發效率
- 配置sentry 自動監控 和ignore log設置
- flask-env 從.env文件中加載配置
- flask+pytest 進行單元測試,配置數據庫
-
部署往往是新手寫程序遇到的難題,有了docker之後,方便了很多。但每次更新完自己的代碼,重新發布到服務器上又要花費一些時間。這裏提供一種解決思路:
- docker-compose容器編排自己的代碼,比如nginx容器+mysql+redis等等。多個服務相互依賴如何解決。
- gitlab ci/cd流程,對整個代碼進行靜態檢查以及集成測試。以及持續發佈。每次git push後,代碼能一鍵部署到服務器上。
github地址鏈接
如果對你有幫助,希望能Star
ci/cd 持續集成&持續部署
通過gitlab ci+docker-compose 完成個人項目的持續發佈
docker-compose: nginx+mysql+redis 通過Dockerfile將程序運行在容器中
保證每次Push代碼,線上的代碼可以一鍵更新。
ssh爲非對稱加密,需要在本機上生成公鑰和私鑰,然後把公鑰交給需要登錄的機器。然後將私鑰以變量
的信息存在gitlab ci中。
test
在gitlab runner中通過docker鏡像和依賴進行測試。進行flak8和pytest單元測試。
deploy
通過ssh命令更新server下的代碼,然後docker-compose rebuild
每次向gitlab push代碼的時候,自動觸發測試任務,手動觸發deploy任務。
celery
在create_app時,加載update_celery方法。更新config,同時將task放在context下
新建run_celery文件:
from jasmine_app import create_app
from jasmine_app import celery
app = create_app()
app.app_context().push()
運行
celery worker -B -A run_celery.celery --loglevel=info
發佈鏡像到docker.io
docker build --cache-from jasmine:latest -t jasmine:latest .
docker tag jasmine:latest fjl2401/jasmine
docker push fjl2401/jasmine
flask-env
安裝: pip install python-dotenv
在root目錄下加入.env文件 .env文件中加入配置
- FLASK_DEBUG=True or False
- FLASK_APP=jasmin_app
- FLASK_ENV=development
配置sentry
需要去sentry註冊並生成祕鑰,官方文檔也挺好的。主要給出屏蔽錯誤信息方法。
有兩種方法
- raven
- sentry_sdk
pip install --upgrade sentry-sdk[flask]==0.5.5
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
sentry_sdk.init(
dsn="https://[email protected]/1327554",
integrations=[FlaskIntegration()]
)
flask+commands
在需要跑腳本的時候可以把腳本文件統一放在commands下做處理
通過AppGroup自定義cli,然後import_string()將commands加載進來
# extension文件中
usr_cli = AppGroup("user")
import_string("play_flask.single_app.command")
# 寫在commands文件夾中
@usr_cli.command("create_user")
def create_user():
"""
create user
"""
print("create user {}".format("cli"))
print(current_app.config)
# 在init_app時
app.cli.add_command(usr_cli)
gunicorn運行
app中create_app 並運行
gunicorn --bind 0.0.0.0