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

问题描述 投票:0回答:3

在我的 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%"

我也遇到同样的错误。

如果生成的密钥带有前导
'$'
(在 DJango 中使用我的生产设置代码),我该如何转义 .env 文件中的 SECRET_KEY?


django版本:3.0.3

django-环境版本:0.4.5

python django environment-variables django-settings
3个回答
0
投票

这篇文章这里建议使用pip安装

dotenv
,彻底简化了隐藏秘钥的过程。至少对于初学者来说。


0
投票

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

首先是使用

.env
:
 明确说明您的 
django_environ

文件中的内容
#.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_environ
dotenv
中存在同样的问题。

检索

.env
值时(使用
dotenv
):

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

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

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

0
投票

我遇到了同样的问题,我找到了解决方法。

.env
文件中的
$
中删除 DJANGO_SECRET_KEY 符号:

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

并将其添加到您的 settings.py

SECRET_KEY = f"${env('DJANGO_SECRET_KEY')}"
© www.soinside.com 2019 - 2024. All rights reserved.