拆分Django的settings.py配置文件,使线下开发和线上部署更方便

1.为什么要拆分

就像本文标题一样,对Django的配置文件Settings.py进行拆分的主要目的就是为了使线下开发和线上开发配合得更加方便。以我的个人网站(www.eastnotes.com)举例,在本地进行开发时的一些配置,比如数据库配置信息,和远程部署服务器上的配置是不一样的。另外,本地开发所单独需要加载的某些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文件了。如果你在配置的过程中有任何问题都可以在下方留言,或者关注我的【公众号:程序员向东】私聊我。等你哟~

    原文作者:程序员向东
    原文地址: https://zhuanlan.zhihu.com/p/67984033
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞