详解Django配置优化方法
一、使用多个setting文件
开发Django项目是最常见,也是最麻烦的一个问题就是如何区分开发配置与线上配置。有一些解决方案是利用配置文件是py文件这个特性,在配置里面写一些if-else来达到区分线上配置与开发配置的目的。但是当项目较为复杂的时候,这样写的可读性十分差,而且可能产生一些条件判定的BUG。
所以更加推荐的方法是使用多个配置文件。
例如新建一个Django项目的时候,默认结构如下:
myDemoSite ├──manage.py └──myDemoSite ├──__init__.py ├──settings.py ├──urls.py └──wsgi.py
新建一个settings的文件夹
里面新建base.py,dev.py,production.py这三个文件,并删掉settings.py文件。
myDemoSite ├──manage.py └──myDemoSite ├──__init__.py ├──settings <-add │ ├──__init__.py <-add │ ├──base.py <-add │ ├──dev.py <-add │ └──production.py <-add ├──urls.py └──wsgi.py
base.py里面是公用的配置,例如SECRET_KEY、INSTALLED_APPS等
dev.py里面是开发环境下的配置,例如DEBUG=True、开发环境数据库等
production.py里是生产环境下的配置,例如线上库的连接等
分别在dev.py、production.py里引入base.py
#dev.py和production.py frommyDemoSite.settings.baseimport*
一般在python里面不建议通过*来导入,因为可能会引发变量名冲突等异常。但在这里是个例外,因为base.py里面是我们的公共配置变量,通过变量名的方法导入的话,代码也会很难看,而且麻烦。
指定配置文件
1.命令行模式指定配置文件
当使用多配置文件并运行pythonmanage.pyrunserver命令的时候,需要注意的是Django此时会报错。
Traceback(mostrecentcalllast): File"manage.py",line21,inmain() File"manage.py",line17,inmain execute_from_command_line(sys.argv) …… File"/python3.7/site-packages/django/conf/__init__.py",line176,in__init__ raiseImproperlyConfigured("TheSECRET_KEYsettingmustnotbeempty.") django.core.exceptions.ImproperlyConfigured:TheSECRET_KEYsettingmustnotbeempty.
原因在于我们将settings.py文件给删掉了,Django引擎找不到配置文件。
因此在这里需要手动指定配置文件,只需要在运行命令后加上--setting即可:pythonmanage.pyrunserver--settings=myDemoSite.settings.dev
$>pythonmanage.pyrunserver--settings=myDemoSite.settings.dev WatchingforfilechangeswithStatReloader Performingsystemchecks... Systemcheckidentifiednoissues(0silenced). Youhave17unappliedmigration(s).Yourprojectmaynotworkproperlyuntilyouapplythemigrationsforapp(s):admin,auth,contenttypes,sessions. Run'pythonmanage.pymigrate'toapplythem. Djangoversion2.2.7,usingsettings'myDemoSite.settings.dev' Startingdevelopmentserverathttp://127.0.0.1:8000/ QuittheserverwithCONTROL-C.
2.Pycharm指定配置文件
如果你是使用的专业版的Pycharm,你一定是习惯直接使用Pycharm来启动服务的方式。这里我们也可以通过修改Pycharm的运行配置信息来达到指定settings配置的目的:
- 修改配置文件里Environmentvariables配置。添加或修改DJANGO_SETTINGS_MODULE参数为ProjectName.settings.dev
- 添加production环境下的配置文件,然后重复第1步
使用多个配置环境带来的另一个好处就是,我们还可以根据不同的端口号来使用不同的环境。例如我可以在8000端口使用开发环境的配置,在8001端口使用模拟生产环境的配置,这样子带来的好处是我们在开发的时候可以同时兼顾多个环境下的状态。
二、使用本地文件管理敏感配置信息
亲爱的朋友,当你辛辛苦苦写好了一个项目,并准备把它开源到github的时候,你一定不希望将你的数据库连接方式也一同上传上来。可是配置文件又必须得上传,这个时候我们就需要用到Django-environ来管理我们的私密信息。
安装方式
使用pip安装
pipinstalldjango-environ
官方文档
https://django-environ.readthedocs.io/en/latest/#django-environ
https://github.com/joke2k/django-environ
使用方法
django-environ的使用十分简单
在项目下新建一个.env文件,内容就是数据库连接等需要保密的字段,例如:
DEBUG=on SECRET_KEY=your-secret-key DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database SQLITE_URL=sqlite:///my-local-sqlite.db CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213 REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=ungithubbed-secret
注意:
.env文件需要添加到你的.gitignore文件里,这样才能保护到你的隐私
开源项目可以添加一个.env.example
在你的setting文件里使用它
#base.py importenviron ROOT_DIR=environ.Path(__file__)-3#获取.env文件的路径 #>environ.Path(__file__)获取到的是base.py的绝对路径 #>'/demoProjects/myDemoSite/myDemoSite/settings/base.py' #>environ.Path(__file__)-3切换到前三层目录 #>'/demoProjects/myDemoSite' env=environ.Env() env.read_env(ROOT_DIR.path('.env').root) DEBUG=env.bool('DEBUG') #DEBUG=True
#dev.py frommyDemoSite.settings.baseimport* DEBUG=env.bool('DEBUG') #DEBUG=True
environ.Path()函数是对os.Path()的一个补充,支持了-操作
django-environ支持bool、str、list、dict、int等多种数据类型
db_url会被转换成django配置所需要的格式
#.env DEV_MYSQL=mysql://user:%23password@127.0.0.1:3306/dbname #dev.py >env.db_url('DEV_MYSQL') >:{'NAME':'dbname','USER':'user','PASSWORD':'#password','HOST':'127.0.0.1','PORT':3306,'ENGINE':'django.db.backends.mysql'}
总结
本文介绍使用了多个配置文件区分开发、生产环境,使用django-environ管理敏感配置信息的方法。
根据个人习惯,也同样可以使用多个.env配置+一个setting.py配置来实现区分开发、生产环境的目的。
在命令行可以指定所使用的.env文件:
PROJECT_ENV=devpythonmanage.py
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。