简介:

我就是个半吊子程序员。在单位写点程序,在家也写点程序。

单位是企业网,不能上互联网,家里也没办法连上企业网,没有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 == '' or ip_3 == '' or hostname == 'db97344c7f2c':
conf = 'dev'
elif ip_3 == '' 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

flask 自动切换环境的更多相关文章

  1. vue-cli根据不同的命令自动切换不同环境地址

    前言 我们再使用vue脚手架开发项目时,不可避免的涉及到多个环境来回切换接口调用地址的问题,在开发环境中可能会通过 ip 来访问后台接口,但是当项目上线后就要把对用的接口地址换成生产环境的地址,肯定不 ...

  2. Maven 整合 spring profile实现多环境自动切换

    Maven 整合 spring profile实现多环境自动切换 时间:2014-03-19 15:32来源:Internet 作者:Internet 点击:525次 profile主要用在项目多环境 ...

  3. Hadoop2.2.0 自动切换HA环境搭建

    自动切换的HA,比手动切换HA集群多了一个zookeeper集群 机器分配: zookeeper:hadoop4,hadoop5,hadoop6 namenode:hadoop4,hadoop5 da ...

  4. WIN10环境下点击通知栏图标时自动切换输入法导致图标位置变动

    这个问题由来已久,每当点击系统右下角任务栏中的按钮时,原本是搜狗输入法就会自动变成“US [ 中文(简体,中国) ]”,图标会自动错位,导致响应的是其他功能. 假设上图是正常的环境,此时我点击电池图标 ...

  5. 获取bing.com的图片并在gnome3中设置自动切换

    发现 bing.com 上的图片很好看,因此打算每天把 bing.com 的图片下载下来,用作桌面. 需要做的是两个部分,爬取图片到目录和设置目录图片为桌面背景并可以自动切换. 第一部分,下载图片,使 ...

  6. 在 Visual Studio 等编辑器/IDE中自动切换输入法,不需要手动的有没有?

    使用Visual Studio写代码,经常遇到的一个问题就是切换中文输入法麻烦,输入完注释//,要切换到中文,输入完引号,要输入中文,然后还需要切换回来,有没有? 有时候中文输入法忽然失效有没有?明明 ...

  7. postman使用之四:切换环境和设置读取变量

    postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...

  8. 使用keepalived实现mysql主从复制的自动切换

    最近测试了一下mysql+keepalived实现主从自动切换,主从都需要安装keepalived,使用vip漂移实现主从自动切换,这里主要记录的是keepalived的文件配置. 这里mysql搭建 ...

  9. 【转】双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计

    架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.此架构主要是由kee ...

随机推荐

  1. Python基础(五) python装饰器使用

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  2. 解决mysql大小写敏感问题

    先在服务中 找到 my.min 文件 在 [mysqld] 下面添加一行: lower_case_table_names = 0 其中 0:区分大小写,1:不区分大小写 设置好后 需要重启服务   然 ...

  3. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  4. #WEB安全基础 : HTTP协议 | 0x7 学会使用wireshark分析数据包

    wireshark是开源,免费,跨平台的抓包分析工具 我们可以通过wireshark学习HTTP报文和进行抓包分析,在CTF中的流量分析需要用到抓包 1.下载和安装 这是wireshark的官网 ht ...

  5. 第七篇——Struts2的接收参数

    Struts2的接收参数 1.使用Action的属性接收参数 2.使用Domain Model接收参数 3.使用ModelDriven接收参数 项目实例 1.项目结构 2.pom.xml <pr ...

  6. Android开发中使用Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...

  7. MB SD Connect Compact 5 Error 95.53392.0 Solved

    MB SD Connect Compact 5 is new released from MB Star company ,and its original version here the copy ...

  8. laravel 分页使用

    分页 //对数据库结果分页 $users = DB::table('users')->paginate(15); //可以对 Eloquent 模型分页: $allUsers = User::p ...

  9. 自制操作系统Antz(2)——进入保护模式 (上) jmp到保护模式

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.htm Linux内核源码分析地址:https://www.cnblogs.c ...

  10. WindowsAPI每日一练(2) 使用应用程序句柄

    WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.html WindowsAPI每日一练() WinMain Win ...