大家好,欢迎来到IT知识分享网。
拆分配置文件settings以适应不同的运行环境
使用Django命令生成一个项目的基本结构时,配置信息默认保存在和项目目录同名的目录下的settings.py文件里, 在实际的开发中,对于一个项目而言,这样往往是不合适的,需要将settings配置文件拆分为几个文件, 线上和线下都会使用的文件放置到base.py文件里,线上的放置在product.py文件里,开发测试的文件放置在develop.py文件里。这样功能划分就明确了,方便我们线上线下的调试。
1)在项目同名目录下,创建一个settings的包(目录下含__init__.py的文件夹)。
2)在settings的包中分别新建3个文件:公共基础base.py(用于配置Django默认生成配置文件),develop.py(用于开发环境)、product.py(用于生产环境)。
3)将原来的settings.py的内容复制到base.py文件中。
4)确认目录OK后,我们需要修改base.py中的时区和语言配置:
#LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' #TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai'
如果有类似公共部分需要修改的,则在base.py中修改即可,例如注册子应用之类的,在此就不一一举例。。
5)之后,对于线上线下不同部分,我们只要导入base.py模块,再针对不同部分进行修改即可,例如线上线下对接不同的测试数据库,我们则可以修改数据库连接:
#导入共有的包 from .base import * DEBUG = True ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
6)修改manage.py文件,Django使用自带服务启动时需要知道settings文件的路径。
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lipin.settings') # 修改为: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lipin.settings.develop')
7)到上生产的时候,使用asgi.py(Django3.x中)或wsgi.py(Django2.x以下版本),则可以更改生产配置文件的路径:
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lipin.settings') # 修改为 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lipin.settings.product')
以上又有个问题,如果线上线下环境切换,又要改动代码, 我们可以通过设置系统环境变量来动态获取,避免修改代码:
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lipin.settings') # 修改为: profile= os.environ.get('LIPIN_PROFILE','develop') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lipin.settings.%s'%profile)
这样通过读取系统环境变量中的LIPIN_PROFILE来控制Django加载不同的settings文件。
这样可以将原来的settings.py文件删掉!!
但是这样就会有个问题,你会发现之前好好的网页我们访问不了了,模板找不到!
这是因为之前的配置文件中,路径问题,因为我们原来的配置文件是在同名目录下,而我们现在将配置文件拆分为一个新的包,所以还要上一级目录才是我们需要的:
# 当前工程的根目录,Django会依次来定位工程内的相关文件 #BASE_DIR = Path(__file__).resolve().parent.parent # 修改为 BASE_DIR = Path(__file__).resolve().parent.parent.parent
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/74533.html