django setting.py中的SECRET_KEY

django setting.py中的SECRET_KEY

官方docs

什么是SECRET_KEY

加密签名官方参考: https://docs.djangoproject.com/en/4.1/topics/signing/

当您使用 创建一个新的 Django 项目startproject时,该 settings.py文件会自动生成并获取一个随机 SECRET_KEY值。该值是保护签名数据的关键——确保其安全至关重要,否则攻击者可以使用它来生成自己的签名值。

SECRET_KEY,用于提供 加密签名,并且应该设置为唯一的、不可预测的值。

警告: 使用公开的的SECRET_KEY 运行Django会击败Django的许多安全保护,并可能导致特权升级和远程代码执行漏洞。 因此,SECRET_KEY 不能泄漏~!

SECRET_KEY用于:

  • 所有 sessions ,如果您使用任何其他会话后端django.contrib.sessions.backends.cache,或者使用默认设置 get_session_auth_hash()

  • messages CookieStorage 或 FallbackStorage
    'django.contrib.messages’在INSTALLED_APPS.

  • 所有使用PasswordResetView token。

  • 加密签名的使用,除非提供了不同的密钥。

PasswordResetView

class PasswordResetView允许用户通过生成可用于重置密码的一次性使用链接并将该链接发送到用户的注册电子邮件地址来重置其密码。

如果满足以下条件,此视图将发送电子邮件:

  • 提供的电子邮件地址存在于系统中。
  • 请求的用户处于活动状态(User.is_activeis True)。
  • 请求的用户有一个可用的密码。使用不可用密码(请参阅 set_unusable_password())标记的用户在使用 LDAP 等外部身份验证源时,不允许请求密码重置以防止误用。

如果不满足这些条件中的任何一个,则不会发送电子邮件,但用户也不会收到任何错误消息。这可以防止信息泄露给潜在的攻击者。

加密签名使用

Web 应用程序安全的黄金法则是永远不要信任来自不受信任来源的数据。有时通过不受信任的介质传递数据很有用。在知道任何篡改都会被检测到的情况下,加密签名的值可以通过不受信任的安全通道传递。

Django 提供了一个用于签名值的低级 API 和一个用于设置和读取签名 cookie 的高级 API,这是登录 Web 应用程序的最常见用途之一。

您可能还会发现签名对以下内容很有用:

  • 生成“恢复我的帐户”URL 以发送给丢失密码的用户。
  • 确保存储在隐藏表单字段中的数据未被篡改。
  • 生成一次性秘密 URL 以允许临时访问受保护的资源,例如用户付费的可下载文件。

Django的签名方法在django.core.signing模块中

>>> from django.core.signing import Signer
>>> signer = Signer()
>>> value = signer.sign('My string')
>>> value
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'

您可以使用unsign方法检索原始值:

>>> original = signer.unsign(value)
>>> original
'My string'

如果您希望保护列表,元组或字典,则可以使用 sign_object() and unsign_object() 方法进行操作:

>>> signed_obj = signer.sign_object({'message': 'Hello!'})
>>> signed_obj
'eyJtZXNzYWdlIjoiSGVsbG8hIn0:Xdc-mOFDjs22KsQAqfVfi8PQSPdo3ckWJxPWwQOFhR4'
>>> obj = signer.unsign_object(signed_obj)
>>> obj
{'message': 'Hello!'}

默认情况下,Signer 类使用SECRET_KEY 设置来生成签名。您可以通过将其传递给签名构造函数来使用其他值:

>>> signer = Signer('my-other-secret')
>>> value = signer.sign('My string')
>>> value
'My string:EkfQJafvGyiofrdGnuthdxImIJw'
使用salt参数

如果您不希望特定字符串的每次出现都具有相同的签名哈希,则可以使用该类的可选salt参数Signer 。使用盐将使用盐和您的签名散列函数播种SECRET_KEY:

验证时间戳值

TimestampSigner是一个Signer将签名时间戳附加到值的子类。这使您可以确认在指定时间段内创建了签名值:

>>> from datetime import timedelta
>>> from django.core.signing import TimestampSigner
>>> signer = TimestampSigner()
>>> value = signer.sign('hello')
>>> value
'hello:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> signer.unsign(value)
'hello'
>>> signer.unsign(value, max_age=10)
...
SignatureExpired: Signature age 15.5289158821 > 10 seconds
>>> signer.unsign(value, max_age=20)
'hello'
>>> signer.unsign(value, max_age=timedelta(seconds=20))
'hello'

生成一个SECRET_KEY

如果你想使用 Django 生成一个,你可以从 python shell 中执行以下操作:

>>> from django.utils.crypto import get_random_string
>>> chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
>>> SECRET_KEY = get_random_string(50, chars)
>>> print SECRET_KEY

django启动报错:django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty
参考URL: https://stackoverflow.com/questions/29455057/django-core-exceptions-improperlyconfigured-the-secret-key-setting-must-not-be

问题描述:
django启动报错:django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

问题分析:
SECRET_KEY如果未设置,Django 将拒绝启动。
您可以在官方docs中阅读有关此设置的更多信息

### Django `settings.py` 文件中的重要配置项 以下是 Django 项目中常见的 11 个重要配置项及其作用: #### 1. **SECRET_KEY** 用于加密签名和其他安全相关操作的秘密密钥。它应该是一个随机字符串,且不应泄露给任何人。 ```python SECRET_KEY = 'your-secret-key-here' ``` 如果未正确设置该值,则可能导致安全性漏洞[^1]。 --- #### 2. **DEBUG** 控制调试模式的开关。当其值为 `True` 时,会显示详细的错误页面;生产环境中应将其设为 `False`。 ```python DEBUG = True # 开发环境 DEBUG = False # 生产环境 ``` --- #### 3. **ALLOWED_HOSTS** 定义允许访问站点的主机名列表,在生产环境中尤为重要。 ```python ALLOWED_HOSTS = ['example.com', 'www.example.com'] ``` 如果不设置或为空数组,可能会引发 HTTP 请求被拒绝的情况。 --- #### 4. **INSTALLED_APPS** 列出所有已启用的应用程序以及第三方库。 ```python INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', ... 'myapp', ] ``` --- #### 5. **MIDDLEWARE** 中间件类的顺序非常重要,它们处理请求和响应的过程。 ```python MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', ... ] ``` --- #### 6. **DATABASES** 数据库连接配置,默认情况下支持 SQLite、PostgreSQL、MySQL 和 Oracle 数据库。 ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ``` 对于其他类型的数据库,需调整 `ENGINE` 和额外参数[^3]。 --- #### 7. **TIME_ZONE** 设定项目的默认时区。Django 使用此值来管理日期时间对象的行为。 ```python TIME_ZONE = 'Asia/Shanghai' ``` 需要注意的是,虽然可以手动修改 `os.environ['TZ']` 的值,但在某些特定场景下 Django 不会自动更改这一变量。 --- #### 8. **LANGUAGE_CODE** 指定网站的语言代码。 ```python LANGUAGE_CODE = 'en-us' # 英语 (美国) LANGUAGE_CODE = 'zh-hans' # 简体中文 ``` --- #### 9. **USE_I18N**, **USE_L10N**, **USE_TZ** 这些布尔值分别表示是否开启国际化 (`i18n`)、本地化 (`l10n`) 和时区支持。 ```python USE_I18N = True USE_L10N = True USE_TZ = True ``` --- #### 10. **STATIC_URL** 和 **STATIC_ROOT** 静态文件的相关配置。 ```python STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'staticfiles' ``` 开发阶段通常不需要关心 `STATIC_ROOT`,但部署到服务器时需要收集静态资源并指向该路径。 --- #### 11. **TEMPLATES** 模板引擎的配置,主要用于渲染 HTML 页面。 ```python TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', ... ], }, }, ] ``` --- ### 示例代码片段 以下展示如何初始化部分核心配置: ```python from pathlib import Path # 定义基础目录 BASE_DIR = Path(__file__).resolve().parent.parent # 秘钥配置 SECRET_KEY = 'your-secret-key' # 调试模式 DEBUG = True # 允许的主机 ALLOWED_HOSTS = [] # 应用安装 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', ] # 中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', ] # 数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # 静态文件 URL STATIC_URL = '/static/' # 模板配置 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, } ] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值