【新增】使用setting文件判断是否处于开发/线上环境

This commit is contained in:
luhuibo 2019-10-22 14:58:48 +08:00
parent 0662a83cfe
commit 6c0f0bb72d
4 changed files with 74 additions and 5 deletions

8
.gitignore vendored
View File

@ -133,3 +133,11 @@ dmypy.json
/my_venv/ /my_venv/
/data/ /data/
/conf/logs/ /conf/logs/
/conf/dev.py
/templates/test_index.html
/templates/new.html
/templates/test_refer.html
/templates/test_base.html
/templates/result.html
/templates/test_sample.html
/templates/404.html

View File

@ -39,6 +39,19 @@ http://39.100.3.165:8188/TextSummarization/
[ipynb的地址]() [ipynb的地址]()
## 本地&线上同步推进(后续优化)
### 业务场景
本地与线上的 Swagger API 文档的接口的地址是不同的,但都依赖同一个配置文件 **`app\config\setting.py`**。<br>
而个人项目有着本地和线上同步,开发和测试同步的需求,会不断修改 **`app\config\setting.py`** 文件,无法用 **`.gitignore`** 做到忽略配置文件,本地和线上配置隔离的效果。
### 解决
**`本地`** 和 **`线上`** 自动根据所处的环境(由 .gitignore 控制)不同,选择不同的配置文件。<br>
那么, **`本地`** 可以比 **`线上`** 多了 **`app/config/dev.py`** 文件; 基于该文件的存在与否,可以用 **`if else`** 控制 **`app/config/`** 中配置输出。
### Demo
1. `echo "/app/config/dev.py" >> .gitignore` # 追加 Git 忽略提交配置到 .gitignore
2. 新建 **`app/config/dev.py`** 文件
## Blueprint分隔视图 ## Blueprint分隔视图
**当你的Flask项目膨胀到一定规模的时候 全部都写到主入口之中。 一定需要按照模块进行拆分。 Blueprint(蓝图)就是这个时候需要使用的东西。** **当你的Flask项目膨胀到一定规模的时候 全部都写到主入口之中。 一定需要按照模块进行拆分。 Blueprint(蓝图)就是这个时候需要使用的东西。**
@ -129,7 +142,7 @@ conda常用命令
- 或者创建虚拟环境安装 - 或者创建虚拟环境安装
## linux部署指南 ## linux部署指南
**1. linux sh & nohup后台运行脚本** **1. linux sh & nohup后台运行python脚本**
- 1创建脚本vim run.sh - 1创建脚本vim run.sh
- 2填写内容并保存nohup python3 -u run.py > nohup.log 2>&1 & - 2填写内容并保存nohup python3 -u run.py > nohup.log 2>&1 &
- 3运行sh run.sh 或者 . run.sh - 3运行sh run.sh 或者 . run.sh
@ -145,7 +158,7 @@ conda常用命令
- & : 最后一个& 是让该命令在后台执行。 - & : 最后一个& 是让该命令在后台执行。
``` ```
**2. 使用gunicorn 部署flask服务** **2. 使用gunicorn 部署flask服务** (个人项目推荐使用这个)
- 1创建脚本vim gunicorn.sh - 1创建脚本vim gunicorn.sh
- 2填写内容并保存 - 2填写内容并保存
- conda activate just_do_it 在linux上创建好自己的环境可选 - conda activate just_do_it 在linux上创建好自己的环境可选
@ -182,14 +195,19 @@ https://www.cnblogs.com/gaidy/p/9784919.html
https://www.hutuseng.com/article/how-to-kill-all-detached-screen-session-in-linux https://www.hutuseng.com/article/how-to-kill-all-detached-screen-session-in-linux
``` ```
**4. 使用flask + nginx + uwsgi**
**4. 使用flask + nginx + uwsgi** (不建议因Flask 与 uWsgi 结合有许多难以处理的 bug)
- 针对用户访问量大的情况,具体参考下面的文章 - 针对用户访问量大的情况,具体参考下面的文章
- https://blog.csdn.net/spark_csdn/article/details/80790929 - https://blog.csdn.net/spark_csdn/article/details/80790929
- https://www.cnblogs.com/Ray-liang/p/4173923.html - https://www.cnblogs.com/Ray-liang/p/4173923.html
- https://blog.csdn.net/daniel_ustc/article/details/9070357 - https://blog.csdn.net/daniel_ustc/article/details/9070357
**5. 使用flask + nginx + gunicorn** **5. 使用flask + nginx + gunicorn** (大项目推荐使用这个)
- 生产环境很多大公司采用这个方式的,后面有时间再研究 - 生产环境很多大公司采用这个方式的,故推荐这个
- 因Flask 与 uWsgi 结合有许多难以处理的 bug故推荐这个
- [Flask + Gunicorn + Nginx 部署](https://www.cnblogs.com/Ray-liang/p/4837850.html)
## linux上杀死gunicorn的进程 ## linux上杀死gunicorn的进程
**方法一** **方法一**

41
conf/setting.py Normal file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''=================================================
@IDE PyCharm
@Author LuckyHuibo
@Date 2019/10/22 14:45
@Desc
## 本地&线上同步推进(后续优化)
### 业务场景
本地与线上的 Swagger API 文档的接口的地址是不同的但都依赖同一个配置文件 **`app\config\setting.py`**<br>
而个人项目有着本地和线上同步开发和测试同步的需求会不断修改 **`app\config\setting.py`** 文件无法用 **`.gitignore`** 做到忽略配置文件本地和线上配置隔离的效果
### 解决
**`本地`** **`线上`** 自动根据所处的环境( .gitignore 控制)不同选择不同的配置文件<br>
那么 **`本地`** 可以比 **`线上`** 多了 **`app/config/dev.py`** 文件; 基于该文件的存在与否可以用 **`if else`** 控制 **`app/config/`** 中配置输出
### Demo
1. `echo "/app/config/dev.py" >> .gitignore` # 追加 Git 忽略提交配置到 .gitignore
2. 新建 **`app/config/dev.py`** 文件
=================================================='''
import os
is_dev_mode = os.path.exists('./conf/dev.py') # 'development' & 'product' (开发环境 or 生产环境)
EXTERNAL_URL = 'server.mini-shop.ivinetrue.com' # 外部(云服务器)地址
INTERNAL_URL = '0.0.0.0:8080' # 内部(本地)地址
SERVER_URL = INTERNAL_URL if is_dev_mode else EXTERNAL_URL
EXTERNAL_SCHEMES = ["https", "http"] # 外部(云服务器)支持 https 和 http 协议
INTERNAL_SCHEMES = ["http"] # 内部只支持http
SERVER_SCHEMES = INTERNAL_SCHEMES if is_dev_mode else EXTERNAL_SCHEMES
IMG_PREFIX = SERVER_URL + '/static/images'
UPLOAD_FOLDER = 'app/static/uploads'
VERSION = "0.3.0" # 项目版本
if __name__ == '__main__':
# 在上一层的run.py文件使用os.path.exists('./conf/dev.py')
# 直接运行本运行测试使用os.path.exists('./dev.py')
print(is_dev_mode)

2
run.py
View File

@ -21,6 +21,7 @@ from APP.SpeechExtraction.speech_blueprint import app_extraction
from APP.TextSummarization.text_blueprint import app_summarization from APP.TextSummarization.text_blueprint import app_summarization
from os.path import abspath, dirname from os.path import abspath, dirname
from conf.logConf import logger from conf.logConf import logger
from conf.setting import is_dev_mode
app = Flask("__main__", static_folder='static', template_folder='templates') app = Flask("__main__", static_folder='static', template_folder='templates')
@ -41,5 +42,6 @@ def index():
if __name__ == "__main__": if __name__ == "__main__":
app.debug = True app.debug = True
logger.info('项目运行GO') logger.info('项目运行GO')
logger.info('is_dev_mode:{}'.format(is_dev_mode))
# main run # main run
app.run(host='0.0.0.0', port=8188) app.run(host='0.0.0.0', port=8188)