簡介:
我就是個半吊子程序員。在單位寫點程序,在家也寫點程序。
單位是企業網,不能上互聯網,家里也沒辦法連上企業網,沒有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)
