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 == '' 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 自动切换环境的更多相关文章
- vue-cli根据不同的命令自动切换不同环境地址
前言 我们再使用vue脚手架开发项目时,不可避免的涉及到多个环境来回切换接口调用地址的问题,在开发环境中可能会通过 ip 来访问后台接口,但是当项目上线后就要把对用的接口地址换成生产环境的地址,肯定不 ...
- Maven 整合 spring profile实现多环境自动切换
Maven 整合 spring profile实现多环境自动切换 时间:2014-03-19 15:32来源:Internet 作者:Internet 点击:525次 profile主要用在项目多环境 ...
- Hadoop2.2.0 自动切换HA环境搭建
自动切换的HA,比手动切换HA集群多了一个zookeeper集群 机器分配: zookeeper:hadoop4,hadoop5,hadoop6 namenode:hadoop4,hadoop5 da ...
- WIN10环境下点击通知栏图标时自动切换输入法导致图标位置变动
这个问题由来已久,每当点击系统右下角任务栏中的按钮时,原本是搜狗输入法就会自动变成“US [ 中文(简体,中国) ]”,图标会自动错位,导致响应的是其他功能. 假设上图是正常的环境,此时我点击电池图标 ...
- 获取bing.com的图片并在gnome3中设置自动切换
发现 bing.com 上的图片很好看,因此打算每天把 bing.com 的图片下载下来,用作桌面. 需要做的是两个部分,爬取图片到目录和设置目录图片为桌面背景并可以自动切换. 第一部分,下载图片,使 ...
- 在 Visual Studio 等编辑器/IDE中自动切换输入法,不需要手动的有没有?
使用Visual Studio写代码,经常遇到的一个问题就是切换中文输入法麻烦,输入完注释//,要切换到中文,输入完引号,要输入中文,然后还需要切换回来,有没有? 有时候中文输入法忽然失效有没有?明明 ...
- postman使用之四:切换环境和设置读取变量
postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...
- 使用keepalived实现mysql主从复制的自动切换
最近测试了一下mysql+keepalived实现主从自动切换,主从都需要安装keepalived,使用vip漂移实现主从自动切换,这里主要记录的是keepalived的文件配置. 这里mysql搭建 ...
- 【转】双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.此架构主要是由kee ...
随机推荐
- Docker Registry V2 Garbage Collection
运行 docker run --rm -v /nfs1/docker/registry:/var/lib/registry registry:2.5.1 garbage-collect -d /roo ...
- Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)
首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...
- 2018-2019-1 20189206 《Linux内核原理与分析》第九周作业
#linux内核分析学习笔记 --第八章 进程的切换和系统的一般执行过程 学习目标:重点关注进程切换的过程,进程调度的时机,操作系统的基本构成以及一般的执行过程. 进程调度的时机 因为进程的调度只发生 ...
- GEC6818交叉开发环境搭建拟稿
为manjaro linux配置交叉工具链 为gec6818开发版下载一个arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 ...
- MySQL 实战笔记
01 | 基础架构:一条SQL查询语句是如何执行的? 大体可以分为: Server 层:包含了连接器.查询缓存.分析器.优化器.执行器,跨存储引擎的功能都在这一层实现的,比如存储过程.触发器.视图等. ...
- python from entry to abandon2
学习Linux已经有大致两周了,依然感觉到自己仍然在运维的大门外徘徊.于是我想要找到一个在Linux之外的业余方向,可以以作为枯燥基础学习的调节.没过多久我就发现了Python可以说是钦定的选择,它作 ...
- DDD 之 Multiple Canonical Models
MultipleCanonicalModels Scratch any large enterprise and you'll usually find some kind of group focu ...
- Learning-Python【26】:反射及内置方法
反射的概念 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射. 反射有四种方法: hasattr:hasattr(object, n ...
- CSS【05】:CSS三大特性
继承性 作用:给父元素设置一些属性,子元素也可以使用,这个我们就称之为继承性 示例代码: <style> div { color: red; } </style> <di ...
- 使用 R 语言挖掘 QQ 群聊天记录
1.获取数据 从 QQ 消息管理器中导出消息记录,保存的文本类型选择 txt 文件.这里获取的是某群从 2016-04-18 到 2016-05-07 期间的聊天记录,记录样本如下所示. 消息记录(此 ...