简介:

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

单位是企业网,不能上互联网,家里也没办法连上企业网,没有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. 关于php

    public private protected 修饰词 public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用父类方法 在实例中可以 ...

  2. fiddler学习总结--手机端(APP/微信小程序)抓包

    步骤一.手机和电脑要在同一个局域网中 步骤二.完成fiddler的基本配置,与web端抓包一样: TOOLS-->options-->connections-->1.设置端口:2.勾 ...

  3. ssh防止暴力破解之fail2ban

    1.利用sshd服务本身防止暴力破解 2.sshd服务防止暴力破解和fail2ban使用方法 先说说一般的防范措施: 方法1: 1.密码足够复杂: 密码的长度要大于8位最好大于14位.密码的复杂度是密 ...

  4. openresty lua 文件上传与删除

    [1]openresty 上传upload源码库 Github:https://github.com/openresty/lua-resty-upload 源码文件upload.lua文件 [2]上传 ...

  5. P3648 [APIO2014]序列分割(斜率优化dp)

    P3648 [APIO2014]序列分割 我们先证明,分块的顺序对结果没有影响. 我们有一个长度为3的序列$abc$ 现在我们将$a,b,c$分开来 随意枚举一种分块方法,如$(ab)(c)$,$(a ...

  6. Docker OpenvSwitch 介绍 or 工作原理

    Docker OpenvSwitch Network 介绍 什么是OpenVSwich OpenvSwich Network:属于第三方网络项目,可以理解为是一个标准的交换机协议. OpenvSwic ...

  7. dijkstral改编

    题意:给你包含n个点的连通图,每个点都有一个权值.给定起点和终点.问你起点到终点的最短路条数,并且输出路径最短且权值之和最大的一条路径. 思路:1.如何根据父节点更新子节点.x,y是父子节点.如果从起 ...

  8. mybatis分页插件PagePlugin

    查询的参数对象里面继承PageInfoWrapper类(也可以不继承这个类,但要保证查询参数对象里面必须要有一个PageInfo属性) 分页信息都在PageInfo这个类里,查询的时候,分页参数,填充 ...

  9. 激活Pychram

    最近更新了Intellij IDEA到2018.1.5之后,使用之前的授权服务器(http://idea.imsxm.com)会提示Outdated License Server Detected,大 ...

  10. Mongo数据库操作/数据库版本号

    第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录 附:http://www.runoob.com/mongodb/mongodb-create-databas ...