Menu
CoddyTech

从环境中读取设置

本课属于 Coddy Django 学习旅程的“JSON API”单元。第 18 课,共 19 课。

网站部署到互联网上的服务器后,有三项设置必须更改。DEBUG = True会向任何人显示你的代码和所有 URL 模式。SECRET_KEY用于签署网站必须信任的值,例如密码重置链接和签名 Cookie,因此不能把它放在别人能看到的代码中。ALLOWED_HOSTS列出了网站提供服务的域名。

通常的做法是从环境变量中读取这些值,服务器会在程序启动时提供这些值。os.environ.get(name, default)可以读取一个环境变量,默认值就是你的电脑会使用的值:

PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "20"))
MAINTENANCE = os.environ.get("MAINTENANCE", "no") == "yes"

环境变量始终是字符串,所以要把它转换成所需的数据类型:用int()转换为数字,用比较操作得到布尔值,用split(",")转换为列表。选择安全的默认值:如果忘记设置变量,DEBUG就会保持关闭。

challenge icon

挑战

中等

从环境中读取三个设置。

  1. 在 mysite/settings.py 的顶部添加 import os。
  2. 替换初始代码中的 SECRET_KEY、DEBUG 和 ALLOWED_HOSTS 行。SECRET_KEY 从 DJANGO_SECRET_KEY 获取,默认值为 "django-insecure-change-me"。只有当 DJANGO_DEBUG 的文本值为 "True" 时,DEBUG 才为 True。ALLOWED_HOSTS 从 DJANGO_ALLOWED_HOSTS 获取,并按逗号拆分,默认值为 localhost,127.0.0.1。

打开 /nope/:你只会看到 Not Found,不会看到 URL 模式列表。

亲手试试

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = "django-insecure-change-me"
DEBUG = True
ALLOWED_HOSTS = []

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "tasks",
]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

ROOT_URLCONF = "mysite.urls"

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

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

LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_TZ = True

STATIC_URL = "static/"

JSON API中的所有课

自己练习: Django 在线编辑器