flask 自动切换环境
简介:
我就是个半吊子程序员。在单位写点程序,在家也写点程序。
单位是企业网,不能上互联网,家里也没办法连上企业网,没有VPN。
主武器是我的笔记本电脑。在单位有一台淘汰的linux服务器,家里有个NUC做的小服务器。
偶然看到别人写的多个flask配置文件,自动切换生产环境和开发环境。
我这比它还麻烦。
单位服务器:
docker_1-1:数据库
docker_1-2:开发(docker-alpin ssh)
docker_1-3:生产
家里服务器:
docker_2-1:数据库
docker_2-2:开发(docker-alpin ssh)
很久以前是直接用windows下flask的测试服务器,后来部署到linux服务器的时候,发现有些库可能因为依赖什么的原因装不上。
就开始动脑筋,经历了在笔记本上装虚拟机linux,…………一系列的折腾。
现在感觉还是让程序启动的时候自动判断环境比较好。
一:class config
在config中定义多个配置类
#环境基类 class Config(object): DEBUG = False TESTING = False SECRET_KEY = 'v%»lÎImyÃUѦ8#ûïÂÓÙÛ@ræD}Ó^Ì©@÷Êñïíé÷ê«!,Ü@.qr2"hÁzKeô>¦Ô¶ïÁúlAÞ' # SERVER_NAME = '0.0.0.0:5000' BABEL_DEFAULT_LOCALE = 'zh_Hans_CN' # 生产环境 class ProductionConfig(Config): DATABASE_URI = 'mysql+mysqlconnector://zzcld:zzcld@mariadb/zzcld' # 开发环境 class DevelopmentConfig(Config): DATABASE_URI = 'mysql+mysqlconnector://zzcld:zzcld@mariadb/zzcld_test' DEBUG = True # 测试环境 class TestingConfig(Config): DATABASE_URI = 'sqlite://' TESTING = True # 家庭环境 class HomeConfig(Config): DATABASE_URI = 'mysql+mysqlconnector://zzcld:zzcld@nuc/zzcld_test' DEBUG = True
其实主要的区别是数据库位置不一样。
二:get host ip
获取本机的IP地址。
import socket # 获取IP地址 def get_host_ip(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip
三:get host name
获取主机的名字
from os import popen def getname3(): return popen('hostname').read()
四:分析:
主机分为两种
1.笔记本电脑
ip 10.* 192.*
2.docker
ip 172.*.*.*
计算机名分3种
1.笔记本电脑(固定)
2.开发用docker(固定)
3.生产用docker(会变)
配置分为三种
1.在单位开发用
1.1 ip 10.*
1.2 ip 192.168.43.*
1.3 hostname de4532ewe
上述3条满足任意一条,即为开发环境
2.在家开发用
2.1 ip 192.168.1.*
2.2 hostname cd12356
上述2条满足任意一条,即为在家的环境
3.生产环境
上面的都不满足,那就是生产环境了。
五:设计
from os import popen import socket #获取IP def get_host_ip(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip #获取hostname def get_host_name(): return popen('hostname').read() # 检查网络地址,判断运行环境 def check_config(): # 检查自己的IP ip = get_host_ip() ip = ip.split('.') ip_1 = ip[0] ip_3 = ip[0] + ip[1] + ip[2] hostname = get_host_name().split()[0] if ip_1 == '10' or ip_3 == '19216843' or hostname == 'db97344c7f2c': conf = 'dev' elif ip_3 == '1921681' or hostname == 'cd12356': conf = 'home' else: conf = 'pro' return conf
好了,根据check_config返回的结果,导入不同的config即可
如下:
from tools.check import check_config con = check_config() if con == 'dev': from config.config import DevelopmentConfig as Config elif con == 'home': from config.config import HomeConfig as Config elif con == 'pro': from config.config import ProductionConfig as Config DATA_BASE_URI = Config.DATABASE_URI
六:配合alembic
仅仅配置DATA_BASE_URI 还是不够的。
数据库要进行升级等等工作,还要配合alembic,alembic的配置当中也有DATA_BASE_URI 。具体位置是:alembic.ini
加入修改alembic.ini
from configparser import ConfigParser fp = 'alembic.ini' # 定义配置文件名 conf = ConfigParser() # 实例化 conf.read(fp) # 打开conf conf.set('alembic', 'sqlalchemy.url', DATA_BASE_URI) with open(fp, 'w') as fw: # 循环写入 conf.write(fw)