掘金 后端 ( ) • 2024-04-26 16:44

项目根目录配置

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

值是当前文件(__file__)的父目录的父目录,即项目的根目录

SELECT_KEY

SECRET_KEY = os.environ.get(
    'DJANGO_SECRET_KEY') or 'n9ceqv38)#&mwuat@(mjb_p%em$e8$qyr#fw9ot!=ba6lijx-6'

SECRET_KEY 值在 Django 项目中用于以下几个关键目的:

  1. 会话签名: 当你使用 Django 的会话系统时,SECRET_KEY 被用来对会话 cookie 进行签名。这确保了会话信息在客户端被安全地传输,并且防止了会话劫持。如果两个会话的签名不匹配,Django 将拒绝处理它们。
  2. CSRF 保护: 在跨站请求伪造(CSRF)攻击防护中,SECRET_KEY 被用来生成 CSRF 令牌。这些令牌用于在客户端和服务器之间验证请求的真实性,防止恶意网站诱使用户执行他们没有授权的操作。
  3. 安全性: SECRET_KEY 还用于其他安全相关的功能,比如生成签名用于消息队列或缓存系统的清理任务,确保只有知道 SECRET_KEY 的请求才能执行这些操作。
  4. 避免硬编码: 在生产环境中,SECRET_KEY 应该是一个难以猜测的字符串,并且不应该在代码库中硬编码。使用环境变量来提供 SECRET_KEY 值是一个常见的做法,这样可以确保在不同的部署环境中使用不同的密钥,同时避免将密钥暴露在代码仓库中。
  5. 部署和迁移: 当你将 Django 应用部署到不同的环境(如开发、测试、生产)时,SECRET_KEY 值应该每个环境都不相同。这有助于在环境之间保持独立性,并且在迁移或部署时不会出现安全问题

在 Django 项目中,SECRET_KEY 是一个非常重要的配置项,它用于加密和签名安全令牌,比如会话(session)cookie。这个密钥需要是独一无二的,并且不应该在生产环境中与他人分享。 在代码中,SECRET_KEY 的值被设置为环境变量 DJANGO_SECRET_KEY 的值,如果该环境变量不存在,则使用一个默认的硬编码值。这种做法的好处是,你可以在不同的环境中使用不同的密钥,例如,在开发环境和生产环境中有可能需要不同的密钥。 这里是代码的详细解释:

  1. os.environ.get('DJANGO_SECRET_KEY')os.environ 是 Python 的一个内置模块,它提供了访问环境变量的能力。get 方法尝试获取名为 'DJANGO_SECRET_KEY' 的环境变量的值。如果该环境变量已经在前端设置了相应的值,那么 Django 将使用这个值作为 SECRET_KEY
  2. or 'n9ceqv38)#&mwuat@(mjb_p%em$e8$qyr#fw9ot!=ba6lijx-6': 如果 'DJANGO_SECRET_KEY' 环境变量不存在,那么 Django 将使用这个默认的硬编码值作为 SECRET_KEY。这个值应该是一个难以猜测的字符串

调试模式的设置


def env_to_bool(env, default):
    str_val = os.environ.get(env)
    # 这里str_val表示的就是defalut变量的值
    # 这行代码从 `os.environ` 字典中检索名为 `env` 的环境变量的值。如果该环境变量未设置,它将返回 `None`。
    # 当default值为None或者default值为"True"时,返回值为True,除此之外都返回False
    return default if str_val is None else str_val == 'True'
    
DEBUG = env_to_bool('DJANGO_DEBUG', True)

是否测试模式运行

TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'

允许访问你应用的所有主机名或 IP 地址

ALLOWED_HOSTS 值可以为通配符(例如*),ip地址(例如127.0.0.1),域名地址(exmaple.py)

允许的跨站点请求伪造攻击

CSRF_TRUSTED_ORIGINS = ['http://example.com']

应用配置

在 Django 项目中设置 INSTALLED_APPS 时,你是在告诉 Django 哪些应用是项目的一部分,这样 Django 就可以加载和注册这些应用中的模型,并为它们提供 URL 配置等。

Django 框架自带了一些内置应用,这些应用提供了 Django 核心功能的基础。以下是 Django 中一些主要内置应用的作用和简介:

  1. django.contrib.admin:

    • 提供了 admin 界面,允许超级用户对模型进行管理。
    • 包含了一个默认的站点,用于管理系统中定义的模型。
  2. django.contrib.auth:

    • 提供了用户认证系统,包括用户帐号、组、权限和会话。
    • 允许自定义用户模型。
  3. django.contrib.contenttypes:

    • 提供了内容类型系统,用于追踪不同类型的内容。
    • 允许对对象进行权限管理和与其他应用的关联。
  4. django.contrib.sessions:

    • 提供了会话支持,允许在用户之间保存和恢复状态。
    • 通常用于维持用户登录状态和购物车等场景。
  5. django.contrib.messages:

    • 提供了消息框架,允许在请求之间传递小量的信息。
    • 常用于显示通知信息,如错误消息或成功提示。
  6. django.contrib.staticfiles:

    • 管理静态文件(如 CSS、JavaScript 和图片)。
    • 允许通过简单的 URL 路径访问这些文件。
  7. django.contrib.admin.sites:

    • 提供了admin站点的扩展点,允许自定义admin站点的行为。
  8. django.contrib.admindocs:

    • 生成admin文档,方便开发者了解admin界面如何使用。
  9. django.contrib.humanize:

    • 提供了一些方便人类阅读的辅助函数,如将数字转换为人性化的格式(如“1,001”)。
  10. django.contrib.redirects:

    • 提供了对重定向的支持,允许在URL配置中定义重定向规则。
  11. django.contrib.flatpages:

    • 允许你像管理静态文件一样管理静态页面。
  12. django.contrib.sitemaps:

    • 提供了生成网站地图(sitemaps)的功能,帮助搜索引擎了解网站的结构和内容。
  13. django.contrib.markup:

    • 提供了几种标记语言的解析器,如Textile、ReST和Markdown,用于轻松生成富文本内容。

这些内置应用是 Django 框架的核心部分,它们为构建web应用提供了基础功能。在创建 Django 项目时,这些应用通常会自动包含在内,但你可以根据项目需求进行选择性安装和使用。

内置应用的使用示例

下面是 Django 中一些内置应用的使用示例:

  1. django.contrib.admin: 假设你有一个 Book 模型,你可以在 admin 中注册它,然后使用 admin 界面来管理书籍。
    from django.contrib import admin
    from .models import Book
    @admin.register(Book)
    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'author', 'published_date')
        fields = ('title', 'author', 'published_date')
    
    访问 http://127.0.0.1:8000/admin/,登录后,你将看到你的 Book 模型,你可以使用它来添加、编辑和删除书籍记录。
  2. django.contrib.auth: 要使用用户认证系统,你首先需要创建用户。这可以通过 admin 界面快速完成。
    python manage.py createsuperuser
    
    然后,你可以登录 admin 界面,点击“用户”链接,添加新用户或管理现有用户。
  3. django.contrib.contenttypes: 要使用内容类型系统,你可以创建一个内容类型,例如一个博客文章。
    from django.contrib import contenttypes
    from .models import BlogPost
    contenttypes.register(BlogPost)
    
    在 admin 中,你可以管理不同的内容类型,并为它们设置权限。
  4. django.contrib.sessions: 要使用会话支持,你需要确保 Django 用于会话存储的表已经创建。
    python manage.py migrate
    
    然后,你可以在你的视图中使用 request.session 来保存和读取会话数据。
  5. django.contrib.messages: 要使用消息框架,你可以在视图中使用 messages.successmessages.error 来向用户显示消息。
    from django.contrib import messages
    messages.success(request, 'Your action was successful!')
    messages.error(request, 'There was an error with your action!')
    
  6. django.contrib.staticfiles: 要管理静态文件,你需要收集静态文件并创建静态文件服务的链接。
    python manage.py collectstatic
    
    然后,你可以在你的 HTML 中使用 {% static 'filename.ext' %} 来引用静态文件。
  7. django.contrib.admin.sites: 要自定义 admin 站点的行为,你可以创建一个自定义的 AdminSite 子类。
    from django.contrib import admin
    class MyAdminSite(admin.AdminSite):
        pass
    my_admin_site = MyAdminSite(name='myadmin')
    my_admin_site.register(MyModel)
    
  8. django.contrib.admindocs: 要生成 admin 文档,你需要运行 django-admin-docs 命令。
    python manage.py admin_doc
    
    这将在你的文档目录中生成 HTML 文档。
  9. django.contrib.humanize: 要使用人性化辅助函数,你可以在模板中直接使用这些函数,如 intcommanaturaltime
    {{ number|intcomma }}
    {{ date|naturaltime }}
    
  10. django.contrib.redirects: 要使用重定向,你可以在你的 URL 配置中定义重定向规则。
    from django.urls import re_path
    from django.contrib.redirects import redirects
    urlpatterns = [
        re_path(r'^old-page/$', redirects.redirect, {'url': '/new-page/'}),
    ]
    
  11. django.contrib.flatpages: 要使用静态页面管理,你可以在 flatpages 应用中注册你的页面。

中间件相关

在Django框架中,中间件的作用是介于Django的请求/响应循环和WSGI应用之间,为请求和响应提供额外的处理能力。中间件可以用于执行以下任务:

  1. 处理请求:在请求到达Django视图之前,中间件可以对请求进行预处理。例如,它们可以验证请求、修改请求数据、添加或删除请求头等。
  2. 处理响应:在响应发送到客户端之前,中间件可以对响应进行后处理。例如,它们可以压缩响应内容、缓存响应或将响应重定向到其他URL。
  3. 会话管理:中间件可以负责处理用户会话,包括会话的创建、维护和到期。
  4. 语言和时区处理:中间件可以帮助Django根据用户的偏好设置正确的语言和时区。
  5. 安全措施:中间件可以添加安全功能,如防止跨站请求伪造(CSRF)攻击、设置HTTP安全头等。
  6. 日志记录和监控:中间件可以记录请求和响应的信息,用于监控、调试和性能分析。
  7. 缓存:中间件可以实现缓存机制,根据请求和响应的内容将结果缓存起来,以提高性能。
  8. 异常处理:中间件可以捕获和处理异常,例如,它可以定义当特定类型的异常发生时如何响应。
  9. HTTP协议处理:中间件可以处理HTTP协议的特定行为,例如,它可以添加条件GET请求支持,或者处理HTTP重定向。

Django内置了一些中间件,如SecurityMiddlewareSessionMiddlewareLocaleMiddlewareCommonMiddlewareCsrfViewMiddleware等,同时,开发者也可以编写自定义中间件来扩展Django的功能。在settings.py文件中的MIDDLEWARE设置中列出中间件,可以配置Django项目中使用的中间件。

举例

在Django项目中,MIDDLEWARE设置是一个中间件类的列表,用于处理传入的请求和 outgoing响应。中间件可以用于处理各种任务,如安全、会话管理、区域设置处理、缓存等。 下面是对提供的列表中每个中间件的简要解释:

  1. django.middleware.security.SecurityMiddleware:为响应添加各种安全相关的头信息。
  2. django.contrib.sessions.middleware.SessionMiddleware:处理会话管理,允许服务器记住从一个请求到下一个请求的信息。
  3. django.middleware.locale.LocaleMiddleware:从Accept-Language头中检测用户的语言偏好,并为请求设置相应的区域设置。
  4. django.middleware.gzip.GZipMiddleware:如果浏览器支持,压缩响应。
  5. django.middleware.cache.UpdateCacheMiddleware:如果响应可缓存且缓存已启用,更新缓存。
  6. django.middleware.common.CommonMiddleware:在响应中添加各种常见HTTP头,如Vary: CookieX-Frame-Options
  7. django.middleware.csrf.CsrfViewMiddleware:保护免受跨站请求伪造(CSRF)攻击。
  8. django.contrib.auth.middleware.AuthenticationMiddleware:提供基于会话的认证。
  9. django.contrib.messages.middleware.MessageMiddleware:为Django的消息框架提供支持,允许您向用户显示消息。
  10. django.middleware.clickjacking.XFrameOptionsMiddleware:添加X-Frame-Options头,防止点击劫持攻击。
  11. django.middleware.http.ConditionalGetMiddleware:支持条件GET请求,这可以通过服务器发送304未修改状态来减少带宽使用,如果请求的资源没有更改。
  12. blog.middleware.OnlineMiddleware:这似乎是一个针对博客应用程序的的自定义中间件。您需要检查此中间件的实现以了解其功能。 这个列表为Django项目提供了一个不错的起点,但您可能需要根据具体要求和您选择使用的的中间件进行调整。

ROOT_URLCONF = 'djangoblog.urls'

在Django框架中,ROOT_URLCONF 设置指定了项目的主URL配置模块。这个模块通常是一个Python模块,其中包含了项目的URL模式定义。这些URL模式定义了如何将Web浏览器中的URL与Django中的视图函数或类相匹配。例如

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('about/', views.about, name='about'),
    # ... 其他URL模式
]

template 模板

举例

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'blog.context_processors.seo_processor'
            ],
        },
    },
]

WSGI_APPLICATION

Django将使用 djangoblog.wsgi.application 模块中定义的WSGI应用对象来处理HTTP请求。通常,这个WSGI应用对象是一个函数,它将请求传递给Django的WSGI处理器,然后将响应返回给服务器。从而前端显示出服务端传递给其的响应内容

DATABASE数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoblog',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
    }
}

AUTH_PASSWORD_VALIDATORS

AUTH_PASSWORD_VALIDATORS 是一个Django设置,它用于配置在用户创建或更新密码时,Django将使用哪些密码验证器来确保密码的强度和安全性。密码验证器是一系列用于检查密码是否符合特定安全标准的函数。

在Django中,默认已经包含了一些密码验证器,它们检查以下方面:

  1. 最小长度:密码必须至少包含多少个字符。
  2. 包含数字:密码必须包含数字。
  3. 包含小写字母:密码必须包含小写字母。
  4. 包含大写字母:密码必须包含大写字母。
  5. 特殊字符:密码必须包含特殊字符(如!@#$%^&*())。

你可以通过在 settings.py 文件中修改 AUTH_PASSWORD_VALIDATORS 来添加或修改密码验证器。例如

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
    # 你可以添加自定义的密码验证器
    {
        'NAME': 'your_app.password_validation.CustomPasswordValidator',
    },
]

国际化

LANGUAGES = (
    ('en', _('English')),
    ('zh-hans', _('Simplified Chinese')),
    ('zh-hant', _('Traditional Chinese')),
)
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

LANGUAGES 设置: LANGUAGES 是一个元组列表,用于定义你的 Django 应用程序支持哪些语言。每个元组包含两个元素:语言代码和一个本地化名称。语言代码是一个简写,通常遵循 ISO 639-1 语言代码标准,后面可能跟着一个连字符和地区代码(例如 zh-hans 表示简体中文,zh-hant 表示繁体中文)。本地化名称是该语言的人性化表示,通常用于用户界面。

LOCALE_PATHS 设置: LOCALE_PATHS 是一个目录列表,用于告诉 Django 在哪里查找翻译文件。这些文件包含了应用程序的不同部分的字符串和它们的翻译。Django 使用 gettext 工具来提取这些字符串,并且用户可以通过语言选择来切换到不同的本地化版本

USE_TZ

这个设置指示 Django 是否应该使用时区功能。False 表示 Django 将不会使用时区功能,所有的日期和时间都将被视为服务器所在的时区。如果你想要使用时区功能,让用户根据自己所在的时区查看日期和时间,你应该将这个设置改为 True。 一般都设置为False

静态资源目录

STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic')

Django中的内置缓存

配置示例

CACHES = {
   'default': {
       'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
       'TIMEOUT': 10800,
       'LOCATION': 'unique-snowflake',
   }
}
# 使用redis作为缓存
if os.environ.get("DJANGO_REDIS_URL"):
   CACHES = {
       'default': {
           'BACKEND': 'django.core.cache.backends.redis.RedisCache',
           'LOCATION': f'redis://{os.environ.get("DJANGO_REDIS_URL")}',
       }
   }

使用示例

from django.core.cache import cache

def my_view(request):
   # 从缓存中获取数据
   data = cache.get('my_key')
   
   if data is None:
       # 如果缓存中没有数据,就计算它
       data = calculate_expensive_operation()
       
       # 将数据存入缓存
       cache.set('my_key', data, timeout=120)  # 设置缓存有效期为2分钟
   
   # 返回数据
   return HttpResponse(data)

def calculate_expensive_operation():
   # 这里是一些耗时的计算
   return 'Result of expensive operation'

日志的常用配置

LOG_PATH = os.path.join(BASE_DIR, 'logs')
if not os.path.exists(LOG_PATH):
   os.makedirs(LOG_PATH, exist_ok=True)

LOGGING = {
   'version': 1,
   'disable_existing_loggers': False,
   'root': {
       'level': 'INFO',
       'handlers': ['console', 'log_file'],
   },
   'formatters': {
       'verbose': {
           'format': '[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d %(module)s] %(message)s',
       }
   },
   'filters': {
       'require_debug_false': {
           '()': 'django.utils.log.RequireDebugFalse',
       },
       'require_debug_true': {
           '()': 'django.utils.log.RequireDebugTrue',
       },
   },
   'handlers': {
       'log_file': {
           'level': 'INFO',
           'class': 'logging.handlers.TimedRotatingFileHandler',
           'filename': os.path.join(LOG_PATH, 'djangoblog.log'),
           'when': 'D',
           'formatter': 'verbose',
           'interval': 1,
           'delay': True,
           'backupCount': 5,
           'encoding': 'utf-8'
       },
       'console': {
           'level': 'DEBUG',
           'filters': ['require_debug_true'],
           'class': 'logging.StreamHandler',
           'formatter': 'verbose'
       },
       'null': {
           'class': 'logging.NullHandler',
       },
       'mail_admins': {
           'level': 'ERROR',
           'filters': ['require_debug_false'],
           'class': 'django.utils.log.AdminEmailHandler'
       }
   },
   'loggers': {
       'djangoblog': {
           'handlers': ['log_file', 'console'],
           'level': 'INFO',
           'propagate': True,
       },
       'django.request': {
           'handlers': ['mail_admins'],
           'level': 'ERROR',
           'propagate': False,
       }
   }
}