flask 專案開發實戰

memristor發表於2020-04-19

組內需要做一個專案,由於專案規模較小,就選擇了小巧靈活的flask作為框架。此文記錄了flask專案從開發到部署的一些經歷。

flask
flasgger:用於自動生成api文件
mysqlclient:mysql驅動
flask_sqlalchemy:mysql orm封裝
sqlalchemy:mysql orm封裝
flask_cors:跨域
elasticsearch:es驅動
pandas:資料處理,excel處理
requests:網路請求庫

|-- README.md  
|-- app  
    |-- api  api檔案
    |-- bin  定時任務、可執行檔案
    |-- lib  通用庫
    |-- model  模型
    |-- run.py  api入口檔案
    |-- test  測試檔案
|-- bin  啟停指令碼
|-- config  nginx配置、uwsgi配置
|-- document  存放生成到文件
|-- log 日誌目錄,包括專案自身日誌、nginx日誌、uwsgi日誌
|-- requirements.txt
|-- .gitignore

git

__pycache__/
*.py[cod]
*$py.class
.idea/
*.log
.env
.venv
.DS_Store
config.py
  • 請首先建立個人分支
  • 每次提交程式碼前請合併master分支的程式碼到當前分支
  • 測試請合併到 test分支,合併到test 分支後會自動觸發構建並部署到測試伺服器
  • 測試無問題後請合併到master分支進行線上釋出

通過環境變數區分線上環境與測試環境

線上環境配置環境

check_env=$(grep "export FLASK_ENV=production" /etc/profile;echo $?)
if [ "$check_env" -eq 0 ];then
  echo "FLASK_ENV=production exists in /etc/profile"
else
  echo "export FLASK_ENV=production">>/etc/profile
fi

通過環境變數選擇不同的配置

CONFIG_OBJECT_MAPPER = {
  'development': 'app.config.DevelopConfig',
  'production': 'app.config.ProductionConfig',
}

配置檔案的樣式,通過類的繼承進行配置複用

class Config(object):
    DEBUG = False

class ProductionConfig(Config):
    pass

class DevelopConfig(Config):
      DEBUG = True
      TESTING = True
      PRESERVE_CONTEXT_ON_EXCEPTION = True
      ENV = "development"
      SQLALCHEMY_ECHO = True

nginx+uwsgi

uwsgi配置

[uwsgi]
module = app:name_app
master = true
#protocol = http 
reload-mercy = 8
max-requests = 1000
touch-reload = /tmp/reload.txt
processes = 10
chdir = /xx/xx
socket = 0.0.0.0:8000
logto = /xx/xx/uwsgi.log
chmod-socket = 660
vacuum = true
stats = /var/uwsgi.status
pidfile = /var/uwsgi.pid

nginx配置

server {
    listen 80;
    server_name xx.com;
    access_log /xx/log/nginx_access.log main;
    error_log /xx/log/nginx_err.log;

    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header    Host $host;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }

    location /document {
        root /xx/;
    }
}

啟動指令碼,start.sh,湊合可用

#!/bin/bash

set -x  -u -o pipefail

UWSGI_BIN=/xx/uwsgi
NGINX_BIN=/xx/nginx
NGINX_CONF=/xx/nginx.conf
TGW_GOT_NGINX_CONF=/dxx/product_nginx_tgw_got.conf
UWSGI_INI=/xx/product_uwsgi.ini
DOCUMENT_PATH=/xx/document

check_env=$(grep "export FLASK_ENV=production" /etc/profile;echo $?)
if [ "$check_env" -eq 0 ];then
  echo "FLASK_ENV=production exists in /etc/profile"
else
  echo "export FLASK_ENV=production">>/etc/profile
fi

# 如果uwsgi已經啟動,則只進行過載配置;如果沒有啟動則啟動
if pidof uwsgi
then
  echo "uwsgi has been started, reload the config"
  touch /tmp/reload.txt
else
  echo "start uwsgi ..."
  $UWSGI_BIN -d --ini $UWSGI_INI
fi

sleep 5
$UWSGI_BIN --connect-and-read /var/uwsgi.status

ln -s /data/apps/tgwgot/config/product_nginx_tgw_got.conf $TGW_GOT_NGINX_CONF
file $TGW_GOT_NGINX_CONF

# 如果nginx已經啟動,則只進行過載配置;如果沒有啟動則啟動
if pidof nginx
then
  echo "nginx has been started, reload the config"
  $NGINX_BIN -s reload -c $NGINX_CONF
else
  echo "start nginx ..."
  $NGINX_BIN -c $NGINX_CONF
fi

chmod -R 755 $DOCUMENT_PATH

pidof nginx
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章