zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    html表格,table标签
    2-3VRP的基本配置
    6 sys模块
    3 datetime模块
    2 time模块
    1 模块和包的介绍
    12 函数进阶---生成器
    13 函数进阶---迭代器
    10 函数进阶---闭包
    11 函数进阶---装饰器
  • 原文地址:https://www.cnblogs.com/jackadam/p/9807908.html
Copyright © 2011-2022 走看看