django拆分 settings

1.为什么要拆分

就像本文标题一样,对 Django 的配置文件 Settings.py 进行拆分的主要目的就是为了使线下开发和线上开发配合得更加方便。以我的个人网站(sunwu.zone)举例,在本地进行开发时的一些配置,比如数据库配置信息,和远程部署服务器上的配置是不一样的。另外,本地开发所单独需要加载的某些 APP(比如 django-debug-toolbar),在部署服务器上就不需要加载。

在拆分之前,我的解决方案是将 djangoblog/settings.py 文件写入 .gitignore 配置文件中,这样在版本控制的时候,Git 就会忽略对这个文件的跟踪,从而保持本地配置和远程配置的不一样。但这样做的缺点就是,每当我需要更改配置文件的时候,就需要改两次,非常麻烦。通过对配置文件的拆分,就能大大减轻这种不便,接下来看具体操作。

2.拆分后的效果

├── settings
│   ├── __init__.py
│   ├── base.py
│   ├── local.py
│   └── production.py

我将原始settings.py文件拆分成了3个文件,base.py存放在本地开发和线上部署所共同的配置信息,local.py存放本地开发所特有的数据库配置等信息,production.py存放线上部署所特有的数据库配置等信息。init.py是一个空文件,作用是使seetings文件夹成为一个包文件。以便使用import语句。

3.拆分步骤

3.1 创建文件

在原始settings.py配置文件的同级项目下创建一个settings文件夹,然后在该文件夹下创建四个.py文件,命名参考上面一段内容。注意,一定要创建一个空的__init__.py文件。否则后期进行导入操作的时候一定会遇到如下的报错:

ModuleNotFoundError: No module named 'djangoblog.settings.local'; 'djangoblog.settings' is not a package

3.2 内容拆分

内容的拆分需要你从settings.py文件中进行筛选,将线上线下所共同需要的配置放入base.py中,将线下独有的配置放入到local.py中,将线上所独有的配置放入production.py中。

3.2 内容导入

要想使 local.pyproduction.py 都能使用到 base.py 文件中的配置,我们需要在这两个文件的顶部写入 import 语句:

from .base import *

以上就完成了内容上面的拆分,但仅仅拆分完是不够的,此时django还不能自动识别并使用这些配置文件,我们还需要接下来的相关配置。

4.相关配置

4.1 修改 manage.py

manage.py应该是我们初学django时就会使用到的一个工具文件,使用它我们可以启动项目,创建APP,创建超级用户等操作。当我们使用它启动项目的时候,它会自动加载文件中的一个配置:DJANGO_SETTINGS_MODULE,该配置指定了配置文件的所在位置,由于我们更改了配置文件,因此也一定要更改它才能正常启动Django,你需要将djangoblog换成你的项目名即可。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoblog.settings.local')

4.2 修改BASE_DIR

base.py 文件中有一个配置文件路径的选项,拆分之前的代码如下:

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

这样设置的BASE_DIR的值是 /Users/reborn/PycharmProjects/djangoblog ,也就是说指向的是项目的根目录,但是拆分之后,该值所指向的是 /Users/reborn/PycharmProjects/djangoblog/djangoblog ,如果不修改,django会找不到使用了这个路径的文件,比如模板文件,会报出下面的错误:

django.template.exceptions.TemplateDoesNotExist: base.html

因此,我们只需要将此目录指向上一级目录就可以了,使用join完成:

BASE_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "..")

4.3 修改 wsgi.py

修改这个文件的需求是我在部署时才发现的,在完成上面的步骤之后,我就通过git更新了服务器上的配置文件,重启 nginxuwsgi 之后,网站依然打不开。使用 python manage.py runserver 之后,项目能正常启动,但是网站依然打不开。

于是我突然想到应该是uwsgi找不到我的配置文件,因为线上部署的话是通过uwsgi来启动我们的项目的。打开djangoblog下的wsgi.py文件后,不出我所料,这里面同样有一个有关DJANGO_SETTINGS_MODULE的配置,因此我将它指向我的production.py配置文件:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoblog.settings.production')

此时,再打开网站就没有问题了。

4.4 修改 Pycharm

如果你用的是 Pycharm 进行 Django 开发的话需要进行此项修改。每次使用 Pycharm 运行项目的时候,它都会默认加载一个自带的配置,这个配置在 Pycharm 运行按钮的旁边,下拉菜单中有一个 Edit Configurations,点击之后修改里面的 Environment variables ,目的也是让 Pycharm 能够找到我们的本地配置文件:

PYTHONUNBUFFERED=1;DJANGO_SETTINGS_MODULE=djangoblog.settings.local

至此,对Django配置文件的拆分工作已经完成,你可以删除原来的 settings.py 文件了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值