python sanic部署_Sanic教程:配置

配置

对于一个项目来说,配置是一个很严肃的问题,比如说:在开发环境和生产环境中,配置是不同的,那么一个项目该如何自由地在不同的配置环境中进行切换呢,思考下,然后带着答案或者疑问往下阅读。

单一配置

撸起袖子,开始吧,新建文件夹 demo2 ,内部建立这样的文件结构:

demo02

├── config

│   ├── __init__.py

│   └── config.py

└── run.py

其中 run.py 内容如下:

#!/usr/bin/env python

from sanic import Sanic

from sanic.response import text

app = Sanic()

@app.route("/")

async def test(request):

return text('Hello World!')

if __name__ == "__main__":

app.run(host="0.0.0.0", port=8000, debug=True)

代码示例中开启了 debug 模式,假设我们需要通过 config.py 配置文件来实现控制服务的 debug 模式开启与否,那该怎么实现呢。

在 config.py 中添加一行:DEBUG=True ,然后 run.py 内容改为:

#!/usr/bin/env python

from sanic import Sanic

from sanic.response import text

from config import DEBUG

app = Sanic()

@app.route("/")

async def test(request):

return text('Hello World!')

if __name__ == "__main__":

app.run(host="0.0.0.0", port=8000, debug=DEBUG)

表面上看,功能确实实现了,但这实际上却不是很好的做法,若部署在生产环境中,难道还要特地再将 debug 改为 False 么,这显然很浪费时间,如果需要改变的参数有很多,那就很难维护了。

多配置

那么,正确的做法应该是怎么样的呢?

我们应当依据不同的环境来编写各自对应的环境,举个例子,比如生产环境就对应pro_config,开发环境就对应dev_config.py等等

具体该怎么实施?首先在文件夹 demo2 ,内部建立这样的文件结构:

demo02

├── config

│   ├── __init__.py

│   ├── config.py

│   ├── dev_config.py

│   └── pro_config.py

└── run.py

然后使用类继承的方式使这三个配置文件联系起来,比如在 config.py 中就只放公有配置,如:

#!/usr/bin/env python

import os

class Config():

"""

Basic config for demo02

"""

# Application config

TIMEZONE = 'Asia/Shanghai'

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

而在 pro_config.py或dev_config.py 中就可以自由地编写不同的配置了:

# dev_config

#!/usr/bin/env python

from .config import Config

class DevConfig(Config):

"""

Dev config for demo02

"""

# Application config

DEBUG = True

# pro_config

#!/usr/bin/env python

from .config import Config

class ProConfig(Config):

"""

Pro config for demo02

"""

# Application config

DEBUG = False

配置文件还需要根据系统环境变量的设置进行不同配置环境的切换,比如设置 MODE 系统环境变量,这里从系统环境变量得到配置也是个不错的方法,一般说利用gunicorn配置worker数目之类的,都可以使用这种方案。

然后可以根据其不同的值切换到不同的配置文件,因此在 __init__.py 中需要这么写:

#!/usr/bin/env python

import os

def load_config():

"""

Load a config class

"""

mode = os.environ.get('MODE', 'DEV')

try:

if mode == 'PRO':

from .pro_config import ProConfig

return ProConfig

elif mode == 'DEV':

from .dev_config import DevConfig

return DevConfig

else:

from .dev_config import DevConfig

return DevConfig

except ImportError:

from .config import Config

return Config

CONFIG = load_config()

默认 MODE 设置为 DEV,在 run.py 文件中就可以这么调用:

#!/usr/bin/env python

from sanic import Sanic

from sanic.response import text

from config import CONFIG

app = Sanic()

app.config.from_object(CONFIG)

@app.route("/")

async def test(request):

return text('Hello World!')

if __name__ == "__main__":

app.run(host="0.0.0.0", port=8000, debug=app.config['DEBUG'])

而在生产环境的服务器上,直接通过设置系统变量就可以达到配置修改的目的了,如下:

# 通过设置MODE的值进行配置文件的选择

export MODE=PRO

若是利用 supervisor 来启动服务,可通过添加environment = MODE="PRO" 来设置环境变量,是不是很方便呢。

说明

其实我编写这种微服务,配置更新是很正常且很频繁的需求,这样的话我就必须要求我的代码可以实现热更新,也就是可以迅速的修改配置,且迅速的生效,目前我使用的是ZooKeeper来实现这个需求,有兴趣的朋友可以详细了解,或许你也是用这个方案呢?

如果你有更好的方案,不妨告知一二。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作多台_一支热电偶能否连接多台显示仪表

一支热电偶能否连接多台显示仪表,这个问题常有人提出,因为随着DCS系统的应用及对管理工作的要求,需要对一个信号在多处显示也是常有的事。一支热电偶能否连接多台显示仪表或DCS系统板卡,连接后能否保证测量精度,这是人…

个性签名设计软件_佩服!我用Python设计了一个签名软件

临近年末,大家都忙着签发礼品,写的一手好的签名,会让大家更有成就感,今天,小安就带领大家来设计一个基于tkinter爬虫的签名设计软件,方便大家设计签名。要设计这款软件,就需要了解tkinter与爬虫…

华为硬件工程师社招机考题库_中级会计机考你了解吗?机考操作常见八大问题速看...

中级会计考试采用无纸化机考的形式,考生们在备考时要多熟悉机考操作,为了帮助考生提前了解无纸化机考,东奥小编整理了一些机考的常见问题,希望能够帮助到大家!一、参加无纸化考试的考生允许带计算器入场吗?…

网站攻击软件_佳能遭严重勒索软件攻击,10TB的数据被窃取,大量服务宕机

佳能遭严重勒索软件攻击,10TB的数据被窃取,大量服务宕机Garmin 遭勒索攻击的风波未平,近日,佳能又遭受了勒索软件攻击,攻击除了让佳能的一些网站宕机外,据说还导致佳能服务器中高达 10TB 的数据被盗。 影响…

python安装rarfile模块_python windows下安装pip及rarfile

python之所以被广泛使用,倒不见得是本身语法简单,而是而nodejs/javascript一样把三方库的依赖管理简化了,而不用和java一样非得通过maven管理,而且还得打包后在classpath中才能允许,这导致写一些小功能特别省事&#x…

js datagrid新增一行_Django接口新增页面编写_2(十五)

做一个好看的页面真的是一件困难的事情,所以还是遵循复制后修改的原则,首先是借鉴httpbin页面的方式进行块状展开。块状从模版中找到类似的html代码:块状我们可以看到一下它的动态效果,可以自主的展开和合拢。蛮符合我们的要求的动…

uboot下nand flash读写方法_鸿蒙HarmonyOS烧录方法总结

1.烧录工具理解HarmonyOS驱动框架,用户态APP和内核态驱动之间的通信机制。HarmonyOS烧录使用的海思自研的烧录工具Hitool,使用起来相对来说比较简单。整体界面如图所示:2. 烧录内容烧录内容主要分为两部分,一部分是引导文件fastbo…

adapt和adopt的区别_adopt和adapt的区别

1、意思含义不同,adapt是适应于的意思;adopt是收养采取的意思。2、使用形式不同,adapt可以及物动词,意思是“使适应,使适合”;adopt是及物动词,接名词或代词作宾语。作“采用,采纳,采取”解时,后面常接方法、方针、步骤…

合成孔径雷达_合成孔径雷达(SAR)基础:汇总

详细分析:合成孔径雷达成像技术对雷达成像的几点补充消费级小型无人机的合成孔径雷达成像我国微型合成孔径雷达发展现状对比三种天基系统,看SAR成像模式星载SAR详解:“高分三号”微波遥感卫星机载Pol-InSAR系统,新体制SAR成像结果…

将命令结果赋给变量_不得不了解的quot;变量quot;(2)—— 变量的赋值

祝大家圣诞快乐,今天晚上下班后去滑雪,第一次尝试单板,看着别玩玩得挺酷的,自己耍起来摔得差点骨头没散架!愈挫愈勇啦,就像我们学习脚本一样,要坚持学下去练下去才能熟练,才能日后装…

vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效

安装SonarQube插件在VScode的扩展里面,安装SonarQube support for Visual Studio Code extension, 在安装了 SonarQube 之后,使用打开 VSCode 命令搜索功能,输入 Sonar,搜索结果如下:sonar lint 全局配置文…

数据立方体_立方体纹理

立方体纹理就是包含6个2D纹理的纹理.6个纹理有序排列在立方体的6个面.其可以通过方向向量采样立方体纹理上的纹素.创建立方体贴图跟创建2D贴图一样,但是绑定到GL_TEXTURE_CUBE_MAP上.glGenTextures(1, &CubeMapID); glBindTexture(GL_TEXTURE_CUBE_MAP, CubeMapID);立方体纹…

python运动目标检测与跟踪_基于OpenCV的运动目标检测与跟踪

尹俊超,刘直芳:基于OpenCV的运动目标检测与跟踪2011,Vol.32,No.828170引言运动目标检测跟踪技术在航空航天遥感、生物医学、工业自动化生产、军事公安目标侦查、智能机器人、多媒体电视制作、文化艺术等领域都有着非常广泛的应用,如由卡耐基梅…

db2 控制台执行创建函数语句_DB2数据库中创建定义函数

本文将为您详细介绍DB2数据库中创建用户自定义行数,用以扩展扩展内置的 DB2 函数的方法,供您参考,希望对您有所帮助。可以创建用户定义函数来扩展内置的 DB2 函数。例如,创建计算复杂的算术表达式或操作字符串的函数,然…

华为官方强制线刷工具_一加8/8Pro 线刷救砖

9008线刷是高通平台设备底层的刷机模式,是降级救砖必备良品,有了它,放心刷不想自己动手或遇到困难,可在后台回复: 远程刷机如果你是新手,要9008降级或者救砖,请先准备好充足的时间和良好的心态,…

python3.5兼容2.7吗_Python版本2.7切3.5和3.5切2.7

在Ubuntu上是自带Python2.7和3.5的 当你在终端输入Python的时候是显示Python2.7的叫大家你怎么切换到Python3.5版本1,查看是否存在python3.5终端输入 cd /usr/local/libls 查看 如果存在Python3.5 继续 没有的话 sudo apt-get install python3用命令删除 usr/bin/ 目录下默认的…

python中input函数的返回是哪种类型_Python3.x中input的变化:input函数默认返回字符串类型...

背景:学习《Python基础教程第2版》,第10.3章 标准库:一些最爱 时,运行如下例子:用户选择投掷的骰子数以及每个骰子具有的面数,随机返回骰子的点数,代码如下:from random import rand…

mysql_num_rows+报错_错误:警告:mysql_num_rows()期望参数1为资源,在第19行的C:\ xampp...

我不断收到使用的错误消息mysql_num_rows(),您能帮我弄清楚我的代码出了什么问题吗?这是我的代码://check if the user press submitif (isset($_POST[submit] )) {$customer preg_replace(#[^A-Za-z0-9]#i, , $_POST["username"]…

centos vsftp mysql_CentOS6.4 实现基于mysql的vsftpd

大纲一、安装所需要的软件包二、创建虚拟用户账号三、配置vsftpd四、启动vsftpd服务并查看五、关闭防火墙与SElinux六、配置虚拟用户有不同的访问权限一、安装所需要的软件包1. 安装开发环境[rootftp ~]# yum -y groupinstall "Development Tools" "Development…

java实时监听mysql_java实时监控mysql数据库变化

对于二次开发来说,很大一部分就找找文件和找数据库的变化情况对于数据库变化。还没有发现比较好用的监控数据库变化监控软件。今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化1、打开数据库配置文件my.ini (一般在数据库安装目录)(D:\MYS…