您的当前位置:首页【Django】在项目中使用python-decouple将设置

【Django】在项目中使用python-decouple将设置

2024-12-12 来源:哗拓教育

将博客代码提交到仓库的时候,也许不经意间会将你不想泄漏的信息(比如数据库url,密码,密钥,调试状态,电子邮件主机,允许的主机等等)暴露。所以我们需要考虑,将我们的信息保存在安全的地方(比如直接保存在服务器上,而不是github)。

为了达到这个目的,我们将会用到一个模块,python-decouple,它可以将代码中的设置参数分离,保存在另外一个文件(这个文件就可以直接保存在服务器,而不提交到仓库),我们将这个文件称为环境文件

安装

执行pip install python-decouple

用法

打开settings.py,一般可以看到有如下代码:

SECRET_KEY = '3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!'
DEBUG = True
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'HELLO_DJANGO',
        'USER': 'U_HELLO',
        'PASSWORD': 'hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf',
        'HOST': '127.0.0.1',
        'PORT': '',
    }
}
SECRET_KEY=3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!
DEBUG=True
DB_NAME=HELLO_DJANGO
DB_USER=U_HELLO
DB_PASSWORD=hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf
DB_HOST=127.0.0.1

记得将.env添加到.gitignore,确保环境文件不会提交到仓库。

修改settings.py,首先导入模块

import os

#导入python-decouple模块
from decouple import config

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': config('DB_NAME'),
        'USER': config('DB_USER'),
        'PASSWORD': config('DB_PASSWORD'),
        'HOST': config('DB_HOST'),
        'PORT': '',
    }
}

传递数据

先来看两行代码

DEBUG = config('DEBUG', cast=bool)
EMAIL_PORT = config('EMAIL_PORT', cast=int)

函数config()传递两个参数,一个是传递值的变量名,一个是传递值的类型。通常来说,我们从文件读取的数据会被保存为字符串,这时候,cast参数就派上用场了。在函数config()cast参数可以指定读取的数据的类型。看回上面第一行代码,从环境文件读取到的DEBUG的值被指定为布尔值了。

对于 ALLOWED_HOSTS

ALLOWED_HOSTS=.localhost, 

我们可以指定其cast参数为

ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])

这样看起来很复杂,我们可以使用这个模块自带的Csv函数。

from decouple import config, Csv

ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())

默认值

如果有一个值为定义在环境文件中(即在环境文件中没有这个值),我们可以向config()传递一个额外的参数来指定默认值。

DEBUG = config('DEBUG', default=True, cast=bool)

覆盖

有些时候你想不通过环境文件改变参数,你可以覆盖环境文件的变量。因为环境变量(os.environ)优先级高于环境文件变量:DEBUG=True python manage.py

注意,Decouple总是按此顺序进行赋值:

  • 环境变量;
  • 环境文件:.ini或.env文件;
  • 传递给配置的默认参数。

将环境文件上传到服务器

这里我们主要用到xshell,lrzsz。首先用xshell连接到服务器(具体百度下就知道了)。

然后执行命令yum install -y lrzsz进行lrzsz的安装,接着执行sudo rz命令本地上传文件到服务器,在弹出的文件选择框选择我们的环境文件即可。

如果需要下载服务器的文件,执行sz filename

显示全文