【Django】Django配置

Django settings

Django 设置文件包含 Django 安装的所有配置。本文档解释了settings的工作原理以及哪些设置可用

基础

设置文件只是一个带有模块级变量的 Python module

以下是几个示例设置:

ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = 'webmaster@example.com'

如果设置DEBUGFalse,则还需要正确设置ALLOWED_HOSTS设置。

因为设置文件是一个 Python 模块,所以以下适用:

  • 它不允许出现 Python 语法错误。
  • 它可以使用正常的 Python 语法动态分配设置。例如:
    MY_SETTING = [str(i) for i in range(30)]
  • 它可以从其他设置文件导入值。

指定设置

DJANGO_SETTINGS_MODULE
当您使用 Django 时,您必须告诉它您正在使用哪些设置。 通过使用环境变量 DJANGO_SETTINGS_MODULE 来执行此操作。

DJANGO_SETTINGS_MODULE 的值应该是 Python 路径语法,例如 mysite.settings。 请注意,设置模块应位于 Python import search path上。

django-admin utility

使用 django-admin 时,您可以设置一次环境变量,也可以在每次运行该实用程序时显式传入设置模块。

示例(Unix Bash shell):

export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver

Example (Windows shell):

set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver

Use the --settings command-line argument to specify the settings manually:

django-admin runserver --settings=mysite.settings

On the server (mod_wsgi)

关于WSGI,ASGI的相关介绍可以看博主的这篇文章。

在您的实时服务器环境中,您需要告诉您的 WSGI application使用什么设置文件。 用 os.environ 做到这一点:

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

Read the Django mod_wsgi documentation for more information and other common elements to a Django WSGI application.
在这里插入图片描述

default settings

如果不需要,Django 设置文件不必定义任何设置。 每个设置都有一个合理的默认值。 这些默认值位于 django/conf/global_settings.py 模块中。

这是 Django 在编译设置中使用的算法:

  • global_settings.py 加载设置。
  • 指定的设置文件加载设置,必要时覆盖全局设置

请注意,设置文件不应从 global_settings 导入,因为这是多余的。

Seeing which settings you’ve changed

命令 python manage.py diffsettings 显示当前设置文件和 Django 默认设置之间的差异

有关更多信息,请参阅 diffsettings 文档

在 Python 代码中使用设置

在您的 Django 应用程序中,通过导入对象 django.conf.settings 来使用设置。 例子:

from django.conf import settings

if settings.DEBUG:
    # Do something

注意 django.conf.settings 不是一个模块——它是一个对象。 因此无法导入单个设置:

from django.conf.settings import DEBUG # 这行不通。

另请注意,您的代码不应global_settings 或您自己的设置文件中导入django.conf.settings 抽象了默认设置和站点特定设置的概念; 它提供了一个单一的界面。 它还将使用设置的代码与您的设置位置分离

security

由于设置文件包含敏感信息,例如数据库密码,您应该尽一切努力限制对它的访问。例如,更改其文件权限,以便只有您和您的 Web 服务器的用户才能读取它。这在共享托管环境中尤为重要

Available settings

For a full list of available settings, see the settings reference.

创建您自己的设置

没有什么可以阻止您为自己的 Django 应用程序创建自己的设置,但请遵循以下准则:

  • 设置名称必须全部大写在这里插入图片描述

  • 不要重新发明一个已经存在的设置。

对于序列设置,Django 本身使用列表,但这只是一个约定。

Using settings without setting DJANGO_SETTINGS_MODULE

在某些情况下,您可能希望绕过 DJANGO_SETTINGS_MODULE 环境变量。 例如,如果您单独使用模板系统,您可能不想设置指向设置模块的环境变量

在这些情况下,您可以手动配置 Django 的设置。 通过调用执行此操作:

django.conf.settings.configure(default_settings, **settings)

Example:

from django.conf import settings

settings.configure(DEBUG=True)

根据需要传递 configure() 尽可能多的关键字参数,每个关键字参数代表一个设置及其值。 每个参数名称应全部为大写,名称与上述设置相同。 如果特定设置未传递给 configure() 并且稍后需要,Django 将使用默认设置值。

当您在较大的应用程序中使用框架的一部分时,以这种方式配置 Django 是最有必要的——实际上也是推荐的。

因此,当通过 settings.configure() 进行配置时,Django 不会对进程环境变量进行任何修改(请参阅 TIME_ZONE 的文档以了解为什么通常会发生这种情况)。 在这些情况下,假设您已经完全控制了您的环境。

Custom default settings

自定义默认设置
如果您希望默认值来自 django.conf.global_settings 以外的其他地方,您可以传入一个模块或类,该模块或类提供默认设置作为 default_settings 参数(或作为第一个位置参数)在调用 configure( )

在此示例中,默认设置取自 myapp_defaults,并且 DEBUG 设置设置为 True,无论其在 myapp_defaults 中的值如何:

from django.conf import settings
from myapp import myapp_defaults

settings.configure(default_settings=myapp_defaults, DEBUG=True)

The following example, which uses myapp_defaults as a positional argument, is equivalent:

settings.configure(myapp_defaults, DEBUG=True)

通常,您不需要以这种方式覆盖默认值。Django 默认设置足够温和,您可以安全地使用它们。请注意,如果您确实传入了一个新的默认模块,它将完全替换Django 默认值,因此您必须为可能在您正在导入的代码中使用的每个可能的设置指定一个值。查看 django.conf.settings.global_settings完整列表。

Either configure() or DJANGO_SETTINGS_MODULE is required

需要 configure()DJANGO_SETTINGS_MODULE
如果您没有设置 DJANGO_SETTINGS_MODULE 环境变量,则在使用任何读取设置的代码之前,您必须在某个时候调用 configure()

如果你不设置 DJANGO_SETTINGS_MODULE 并且不调用 configure(),Django 将在第一次访问设置时引发 ImportError 异常。

如果你设置了 DJANGO_SETTINGS_MODULE,以某种方式访问设置值,然后调用 configure(),Django 将引发一个 RuntimeError 指示设置已经配置。 有一个用于此目的的属性:

例如:

from django.conf import settings
if not settings.configured:
    settings.configure(myapp_defaults, DEBUG=True)

此外,多次调用 configure() 或在访问任何设置后调用 configure() 也是错误的。

归结为:仅使用 configure()DJANGO_SETTINGS_MODULE 之一。 两者都不是,也不是。

Calling django.setup() is required for “standalone” Django usage

“独立”Django 使用需要调用 django.setup()
如果您正在使用 Django“独立”的组件——例如,编写一个 Python 脚本来加载一些 Django 模板并呈现它们,或者使用 ORM 来获取一些数据——除了配置设置之外,您还需要一个步骤 .

在您设置 DJANGO_SETTINGS_MODULE 或调用 configure() 之后,您需要调用 django.setup()加载您的设置并填充 Django 的应用程序注册表。 例如:

import django
from django.conf import settings
from myapp import myapp_defaults

settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()

# Now this script or any imported module can use any part of Django it needs.
from myapp import models

请注意,只有当您的代码真正独立时,才需要调用 django.setup()。 当您的 Web 服务器或通过 django-admin 调用时**,Django 会为您处理**。

注:django.setup() 只能被调用一次
因此,避免将可重用的应用程序逻辑放在独立脚本中,以便您必须从应用程序的其他地方的脚本导入。 如果无法避免,请将 django.setup() 的调用放在 if 块中:

if __name__ == '__main__':
    import django
    django.setup()

针对实际项目的settings

Build paths inside the project like this: BASE_DIR / ‘subdir’.

Path.resolve() to make your path absolute (a full path including all parent directories and removing all symlinks)
使您的路径成为绝对路径包含所有父目录并删除所有符号链接的完整路径

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.
BASE_DIR = Path(__file__).resolve().parent.parent

Quick-start development settings - unsuitable for production
See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

在这里插入图片描述

Password validation https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS
Default: [] (Empty list)
The list of validators that are used to check the strength of user’s passwords. See Password validation for more details. By default, no validation is performed and all passwords are accepted
UserAttributeSimilarityValidator,它检查密码和用户的一组属性之间的相似性。.

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },

Internationalization
https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

Static files (CSS, JavaScript, Images)
https://docs.djangoproject.com/en/3.2/howto/static-files/
网站通常需要提供其他文件,例如图像、JavaScript 或 CSS。在 Django 中,我们将这些文件称为“静态文件”。Django 提供 django.contrib.staticfiles帮助您管理它们。
参见:【Django】static files

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static').replace('\\', '/'),
)

Default primary key field type https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD
New in Django 3.2.
默认值:'django.db.models.AutoField'
用于没有 primary_key=True 字段的模型的默认主键字段类型。
通过表迁移自动创建
在为多对多关系创建通过表自动创建的新表时,将尊重 DEFAULT_AUTO_FIELD 的值。
不幸的是,现有通过表自动创建的主键目前无法由迁移框架更新
这意味着如果你切换 DEFAULT_AUTO_FIELD 的值,然后生成迁移,相关模型的主键会被更新,直通表的外键也会更新,但自动创建的直通表的主键不会迁移
为了解决这个问题,您应该向迁移添加一个 RunSQL 操作以执行所需的 ALTER TABLE 步骤。您可以通过 sqlmigratedbshel​​l 或字段的 remote_field.through._meta.db_table 属性检查现有表名。
通过模型显式定义的已经由迁移系统处理
允许对现有自动创建的表的主键进行自动迁移可能会在以后实现

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值