Loading

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

posted @ 2018-10-17 23:36  上官飞鸿  阅读(1826)  评论(0编辑  收藏  举报