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 ...
随机推荐
- 关于php
public private protected 修饰词 public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用父类方法 在实例中可以 ...
- fiddler学习总结--手机端(APP/微信小程序)抓包
步骤一.手机和电脑要在同一个局域网中 步骤二.完成fiddler的基本配置,与web端抓包一样: TOOLS-->options-->connections-->1.设置端口:2.勾 ...
- ssh防止暴力破解之fail2ban
1.利用sshd服务本身防止暴力破解 2.sshd服务防止暴力破解和fail2ban使用方法 先说说一般的防范措施: 方法1: 1.密码足够复杂: 密码的长度要大于8位最好大于14位.密码的复杂度是密 ...
- openresty lua 文件上传与删除
[1]openresty 上传upload源码库 Github:https://github.com/openresty/lua-resty-upload 源码文件upload.lua文件 [2]上传 ...
- P3648 [APIO2014]序列分割(斜率优化dp)
P3648 [APIO2014]序列分割 我们先证明,分块的顺序对结果没有影响. 我们有一个长度为3的序列$abc$ 现在我们将$a,b,c$分开来 随意枚举一种分块方法,如$(ab)(c)$,$(a ...
- Docker OpenvSwitch 介绍 or 工作原理
Docker OpenvSwitch Network 介绍 什么是OpenVSwich OpenvSwich Network:属于第三方网络项目,可以理解为是一个标准的交换机协议. OpenvSwic ...
- dijkstral改编
题意:给你包含n个点的连通图,每个点都有一个权值.给定起点和终点.问你起点到终点的最短路条数,并且输出路径最短且权值之和最大的一条路径. 思路:1.如何根据父节点更新子节点.x,y是父子节点.如果从起 ...
- mybatis分页插件PagePlugin
查询的参数对象里面继承PageInfoWrapper类(也可以不继承这个类,但要保证查询参数对象里面必须要有一个PageInfo属性) 分页信息都在PageInfo这个类里,查询的时候,分页参数,填充 ...
- 激活Pychram
最近更新了Intellij IDEA到2018.1.5之后,使用之前的授权服务器(http://idea.imsxm.com)会提示Outdated License Server Detected,大 ...
- Mongo数据库操作/数据库版本号
第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录 附:http://www.runoob.com/mongodb/mongodb-create-databas ...