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)

 

 

https://github.com/jackadam1981/LearnPython/tree/master/PythonExample/flask_auto_config


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM