当生成SECRET_KEY以"$"开头时,如何从环境文件中转义 Django 中的SECRET_KEY?



在Django项目中,我有一个.env文件,其中包含生产设置的SECRET_KEY

我通过从命令行运行脚本生成了密钥(这里只是打印生成的密钥作为示例(。

python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'

碰巧生成了一个以'$'字符开头的密钥。

我的.env文件是这样的。

DJANGO_SECRET_KEY=$*%0e@-7suq*h#2(srya8n&lhb(qy+73xj_db)tpq4qenknk2%

这是在我的生产设置文件中以以下方式读取

import os
import environ
env = environ.Env()
# BASE_DIR is the root level directory of the project
env_file = os.path.join(BASE_DIR, '.env')
if os.path.exists(env_file):
environ.Env.read_env(env_file=env_file) # reading .env file
SECRET_KEY = env('DJANGO_SECRET_KEY')

当我用这个密钥运行Django项目时,我得到以下错误

django.core.exceptions.ImproperlyConfigured: Set the *%0e@-7suq*h#2(srya8n&lhb(qy+73xj_db)tpq4qenknk2% environment variable

由于'$'字符,Django似乎认为密钥值本身就是一个环境变量。这是可以理解的,因为Bash中的环境变量有一个'$'前缀。

但是当我尝试将.env文件更改为时

DJANGO_SECRET_KEY='$*%0e@-7suq*h#2(srya8n&lhb(qy+73xj_db)tpq4qenknk2%'

DJANGO_SECRET_KEY="$*%0e@-7suq*h#2(srya8n&lhb(qy+73xj_db)tpq4qenknk2%"

我也犯了同样的错误。

如何在.env文件中转义SECRET_KEY,以避免使用前导'$'生成密钥(在DJango中使用我的生产设置代码(


django版本:3.0.3

django-environ版本:0.4.5

本文建议使用pip安装dotenv,并完全简化了隐藏密钥的过程。至少对初学者来说是这样。

似乎有两种方法可以解决这个问题。

第一个是使用django_environ:解释.env文件中的内容

#.env
SECRET_KEY=(str, '$*%0e@-7suq*h#2(srya8n&lhb(qy+73xj_db)tpq4qenknk2%')

另一种是按照上面链接的文章中所示的方式进行操作(https://dev.to/vladyslavnua/how-to-protect-your-django-secret-and-oauth-keys-53fl),这有效地表明在django_environdotenv中存在相同的问题。

检索.env值时(使用dotenv(:

#settings.py
SECRET_KEY = str(os.getenv('SECRET_KEY'))

在这两种情况下,您都明确地向django指示检索到的值是字符串。您可能会遇到其他类似的问题,并且需要明确返回的数据类型:

#.env
DEBUG=(bool, True)
SOME_INT=(int, 1)
…

相关内容

最新更新