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 ...
随机推荐
- Python基础(五) python装饰器使用
这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...
- 解决mysql大小写敏感问题
先在服务中 找到 my.min 文件 在 [mysqld] 下面添加一行: lower_case_table_names = 0 其中 0:区分大小写,1:不区分大小写 设置好后 需要重启服务 然 ...
- C#设计模式(3)——工厂方法模式(转)
C#设计模式(3)——工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...
- #WEB安全基础 : HTTP协议 | 0x7 学会使用wireshark分析数据包
wireshark是开源,免费,跨平台的抓包分析工具 我们可以通过wireshark学习HTTP报文和进行抓包分析,在CTF中的流量分析需要用到抓包 1.下载和安装 这是wireshark的官网 ht ...
- 第七篇——Struts2的接收参数
Struts2的接收参数 1.使用Action的属性接收参数 2.使用Domain Model接收参数 3.使用ModelDriven接收参数 项目实例 1.项目结构 2.pom.xml <pr ...
- Android开发中使用Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...
- 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 ...
- laravel 分页使用
分页 //对数据库结果分页 $users = DB::table('users')->paginate(15); //可以对 Eloquent 模型分页: $allUsers = User::p ...
- 自制操作系统Antz(2)——进入保护模式 (上) jmp到保护模式
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.htm Linux内核源码分析地址:https://www.cnblogs.c ...
- WindowsAPI每日一练(2) 使用应用程序句柄
WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.html WindowsAPI每日一练() WinMain Win ...