Django系列文章目录

第一章 Django使用的基础知识
第二章 setting.py文件的配置
第三章 路由的定义与使用
第四章 视图的定义与使用
第五章 二进制文件下载响应
第六章 Http请求&HttpRequest请求类
第七章 会话管理(Cookies&Session)
第八章 文件上传实现
第九章 多种视图view
第十章 Django5模板引擎
第十一章 模型定义与使用
第十二章 ORM执行SQL语句和事务
第十三章 表单定义与使用
第十四章 内置Admin系统
第十五章 内置Auth认证系统



前言

我们上一章写了如何简单的创建和启动一个Django项目,这章我们要学会如何具体的配置setting.py文件。


一、基本配置

Django 的配置文件 settings.py用于配置整个网站的环境和功能,核心配置必须有项目路径、密钥配置、域名访问权限、App列表、中间件、资源文件、模板配置、数据库的连接方式。

# 项目路径
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
 
 
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
 
# 密钥配置
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-^+$)&&p^atz-o)&ytg&8%6dq!!ujgh7t2w#2n^i_f#r^#*vyqh'
 
# 调试模式
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
 
# 域名访问权限
ALLOWED_HOSTS = []
 
 
# Application definition
# APP列表
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'helloWorld.apps.HelloworldConfig'
]
  • BASE_DIR项目路径:主要通过os模块读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成,一般情况下无须修改。

  • SECRET_KEY密钥配置:密钥配置SECRET_KEY:这是一个随机值,在项目创建的时候自动生成,一般情况下无须修改。主要用于重要数据的加密处理,提高项目的安全性,避免遭到攻击者恶意破坏。密钥主要用于用户密码、CSRF机制和会话Session等数据加密。

    • 用户密码: Django 内置一套Auth认证系统,该系统具有用户认证和存储用户信息等功能,在创建用户的时候,将用户密码通过密钥进行加密处理,保证用户的安全性。
    • CSRF机制:该机制主要用于表单提交,防止窃取网站的用户信息来制造恶意请求。
    • 会话Session: Session的信息存放在Cookie中,以一串随机的字符串表示,用于标识当前访问网站的用户身份,记录相关用户信息。
  • DEBUG调试模式:该值为布尔类型。如果在开发调试阶段,那么应设置为True,在开发调试过程中会自动检测代码是否发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,那么应将其改为False,否则会泄漏项目的相关信息。

  • ALLOWED_HOSTS域名访问权限:设置可访问的域名,默认值为空列表。当DEBUG为True并且 ALLOWED_HOSTS为空列表时,项目只允许以localhost或127.0.0.1在浏览器上访问。当DEBUG为False时,ALLOWED_HOSTS为必填项,否则程序无法启动,如果想允许所有域名访问,可设置ALLOW_HOSTS=[‘*’]。

  • INSTALLED_APPSAPP列表:告诉Django有哪些App。在项目创建时已有admin、auth和sessions 等配置信息,这些都是Django内置的应用功能,各个功能说明如下。

    • admin:内置的后台管理系统。
    • auth:内置的用户认证系统。
    • contenttypes:记录项目中所有model元数据( Django 的ORM框架)
    • sessions: Session会话功能,用于标识当前访问网站的用户身份,记录相关用户信息。
    • messages:消息提示功能。
    • staticfiles:查找静态资源路径。

如果在项目中创建了App,就必须在App列表INSTALLED_APPS添加App类


二、资源文件配置

资源文件配置分为静态资源和媒体资源。静态资源的配置方式由配置属性STATIC_URL、STATICFILES DIRS和STATIC_ROOT进行设置;媒体资源的配置方式由配置属性MEDIA_URL和MEDIA ROOT决定。

静态资源配置=STATIC_URL

静态资源指的是网站中不会改变的文件。在一般的应用程序中,静态资源包括CSS文件、JavaScript文件以及图片等资源文件。
STATIC_URL = ‘static/’
默认配置,app下的static目录为静态资源,可以直接访问。其他目录不行
在这里插入图片描述
运行访问127.0.0.1:8000/static/1.jpg
在这里插入图片描述
通过测试说明,也就app下的static目录下的静态资源才能访问。其他目录不行其他目录不行其他目录不行。(重要的事情说三遍)

静态资源集合配置-STATICFILES DIRS

由于STATIC_URL的特殊性,在开发中会造成诸多不便,比如将静态文件夹存放在项目的根目录以及定义多个静态文件夹等。我们可以通过配置STATICFILES DIRS实现多个目录下的静态资源可以访问。

# 静态资源集合配置
STATICFILES_DIRS = [BASE_DIR / "static", BASE_DIR / "helloWorld/images"]

这样在其他目录下的静态资源也能通过127.0.0.1:8000/static/2.png运行访问

静态资源部署配置-STATIC_ROOT

静态资源配置还有STATIC_ROOT,其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT 主要收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。STATIC_ROOT配置如下:

# 静态资源部署
STATIC_ROOT = BASE_DIR / 'static'

当项目的配置属性 DEBUG 设为True的时候,Django 会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用STATIC_ROOT。当配置属性DEBUG 设为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。 设置STATIC_ROOT需要使用 Django操作指令collectstatic来收集所有静态资源,这些静态资源都会保存在STATIC_ROOT所设置的文件夹里。

媒体资源配置-MEDIA

一般情况下,STATIC_URL是设置静态文件的路由地址,如CSS样式文件、JavaScript文件以及常用图片等。对于一些经常变动的资源,通常将其存放在媒体资源文件夹,如用户头像、歌曲文件等。

媒体资源和静态资源是可以同时存在的,而且两者可以独立运行,互不影响,而媒体资源只有配置属性MEDIA_URL和 MEDIA_ROOT。

我们在项目目录下新建media目录,里面再放一个window.png图片。
在这里插入图片描述

然后在配置文件settings.py里设置配置属性MEDIA_URL和 MEDIA_ROOT,MEDIA_URL用于设置媒体资源的路由地址,MEDIA_ROOT用于获取 media文件夹在计算机系统的完整路径信息,如下所示:

# 设置媒体路由
MEDIA_URL = 'media/'
# 设置media目录的完整路径
MEDIA_ROOT = BASE_DIR / 'media'

配置属性设置后,还需要将media文件夹注册到 Django里,让 Django知道如何找到媒体文件,否则无法在浏览器上访问该文件夹的文件信息。打开项目文件夹的urls.py文件,为媒体文件夹media添加相应的路由地址,代码如下:

from django.conf import settings
from django.contrib import admin
from django.urls import path, re_path
from django.views.static import serve
 
import helloWorld.views
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', helloWorld.views.index),
    # 配置媒体文件的路由地址
    re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media')
]

测试一下http://localhost:8000/media/window.png

在这里插入图片描述

三、模版配置

在 Web开发中,模板是一种较为特殊的HTML文档。这个HTML文档嵌入了一些能够让Django识别的变量和指令,然后由Django的模板引擎解析这些变量和指令,生成完整的HTML网页并返回给用户浏览。模板是Django里面的MTV框架模式的T部分,配置模板路径是告诉Django在解析模板时,如何找到模板所在的位置。创建项目时,在setting,py文件中Django已有初始的模板配置信息,如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]

模板配置是以列表格式呈现的,每个元素具有不同的含义,其含义说明如下。

BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有 DjangoTemplates 和 jinja2.Jinja2,每个模板引擎都有自己的变量和指令语法。

  • DIRS:设置模板所在路径,告诉Django在哪个地方查找模板的位置,默认为空列表。

  • APP_DIRS:是否在App里查找模板文件。

  • OPTIONS:用于填充在RequestContext 的上下文(模板里面的变量和指令),一般情况下不做任何修改。

1.我们是可以在应用里新建templates,供自己的应用使用。在templates下新建index2.html模版文件
在这里插入图片描述

2.将app下的views.py里面添加个index2

def index2(request):
    return render(request, 'index2.html')

在这里插入图片描述

3.在urls.py中加入新的path

path('index2/',helloWorld.views.index2),

4.最后就是在setting.py中的TEMPLATES里的DIRS里面加上应用的模版路径即可。
在这里插入图片描述

5.启动测试:http://127.0.0.1:8000/index2/
在这里插入图片描述

注意:
问:如果说应用里的模版和项目里的模版名字一样,起冲突了。这时候,会选择哪个呢,或者说哪个优先级高?
答: 根据Django底层源码,其实优先级顺序是根据模版配置的目录顺序来定的。
即setting.py中的DIRS配置的先后顺序。
在这里插入图片描述


四、数据库配置

数据库配置是选择项目所使用的数据库的类型,不同的数据库需要设置不同的数据库引擎,数据库引擎用于实现项目与数据库的连接,Django提供4种数据库引擎:
‘django.db.backends.postgresql’
‘django.db.backends.mysql’
‘django.db.backends.sqlite3’ (默认)
‘django.db.backends.oracle’

项目创建时默认使用Sqlite3数据库,这是一款轻型的数据库,常用于嵌入式系统开发,而且占用的资源非常少。在setting.py文件中Sqlite3数据库配置信息如下:

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

如果要把上述的连接信息改成MySQL数据库,首先需要安装MySQL连接模块 mysqlclient

pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple

mysqlclient模块安装后,在项目的配置文件settings.py中配置MySQL数据库连接信息

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

(django5至少需要MySQL 8.0.11版本)

我们来测试下数据库连接;

我们首先在mysql里创建数据库db_startdjango

然后我们用Django5 manage.py 提供的内置命令 migrate 来创建Django内置功能的数据表;

python manage.py migrate

在这里插入图片描述

刷新数据库表:
在这里插入图片描述
这些是Django内置自带的Admin后台管理系统,Auth用户系统以及会话机制等功能需要用到的表。

注意:django也支持pymysql,mysqldb等,但是用的时候会有点小问题,所以建议大家还是用mysqlclient,比较稳定。

同时django支持多数据库;

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_python222',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': '3308'
    },
    'mySqlite3': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'mySql3': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_django',
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': 'localhost',
        'PORT': '3306'
    }
}

例如上面,我们定义了三个数据库,两个mysql,一个sqlite;配置属性DATABASES设有3个键值对,分别是:‘default’,‘mySqlite3’,‘mySql3’,每个键值对代表Django连接了某个数据库。

若项目中连接了多个数据库,则数据库之间的使用需要遵从一定的规则和设置。比如项目中定义了多个模型,每个模型所对应的数据表可以选择在某个数据库中生成,如果模型没有指向某个数据库,模型就会在key为default的数据库里生成。


五、中间件

中间件(Middleware)是一个用来处理 Django 的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变 Django的输入和输出。 当用户在网站中进行某个操作时,这个过程是用户向网站发送HTTP请求(Request);而网站会根据用户的操作返回相关的网页内容,这个过程称为响应处理(Response)。从请求到响应的过程中,当 Django接收到用户请求时,首先经过中间件处理请求信息,执行相关的处理,然后将处理结果返回给用户。

在这里插入图片描述

django默认的中间配置如下:

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',
]

django自带的中间件有:

  • SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。

  • SessionMiddleware:会话Session功能。

  • LocaleMiddleware:国际化和本地化功能。

  • CommonMiddleware:处理请求信息,规范化请求内容。

  • CsrfViewMiddleware:开启CSRF防护功能。

  • AuthenticationMiddleware:开启内置的用户认证系统。

  • MessageMiddleware:开启内置的信息提示功能。

  • XFrameOptionsMiddleware:防止恶意程序单击劫持。

我们也可以自定义中间件:

中间件可以定义五个方法,分别是:(主要的是process_request和process_response),在自己定义中间件时,必须继承MiddlewareMixin

  • process_request(self,request) 请求views方法之前会执行。
  • process_view(self, request, callback, callback_args, callback_kwargs) Django会在调用视图函数之前调用process_view方法。
  • process_template_response(self,request,response) 该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
  • process_exception(self, request, exception) 这个方法只有在视图函数中出现异常了才执行
  • process_response(self, request, response) 请求执行完成,返回页面前会执行

定制中间件

新建Md1自定义中间件类,继承MiddlewareMixin,实现process_request和process_response方法。
在这里插入图片描述

代码如下:

from django.utils.deprecation import MiddlewareMixin


class Md1(MiddlewareMixin):
    def process_request(self, request):
        print('md1 process_request')

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('md1 process_view')
        return None

    def process_exception(self, request, exception):
        print('md1 process_exception')
        return None

    def process_response(self, request, response):
        print('md1 process_response')
        return response

    def process_template_response(self, request, response):
        print('md1 process_template_response')
        return response

setting.py里配置自定义中间件。
在这里插入图片描述
在这里插入图片描述

views.py的index请求处理方法,我们加一句打印。
在这里插入图片描述

运行访问http://127.0.0.1:8000/index2/后如下所示
在这里插入图片描述

六、其他配置

  • ROOT_URLCONF = 'startdjango.urls'它指定了当前项目的根 URL,是 Django 路由系统的入口。

  • WSGI_APPLICATION = 'startdjango.wsgi.application'项目部署时,Django 的内置服务器将使用的 WSGI 应用程序对象的完整 Python 路径。

  • AUTH_PASSWORD_VALIDATORS 这是一个支持插拔的密码验证器,且可以一次性配置多个,Django 通过这些内置组件来避免用户设置的密码等级不足的问题。

  • LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC'分别代表语言配置项和当前服务端时区的配置项,我们常用的配置如下所示:

    • LANGUAGE_CODE 取值是英文:'en-us’或者中文:‘zh-Hans’;

    • TIME_ZONE 取值是世界时区 ‘UTC’ 或中国时区 ‘Asia/Shanghai’。

  • USE_I18N = True 项目开发完成后,可以选择向不同国家的用户提供服务,那么就需要支持国际化和本地化。

  • USE_TZ = True 它指对时区的处理方式,当设置为 True 的时候,存储到数据库的时间是世界时间 ‘UTC’。

  • DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 默认主键自增类型


总结

本章介绍了Django框架中setting.py文件里各个字段的配置和作用,学习了如何配置,后续章节会对Django的路由定义、变量、正则、重定向等方面来介绍该框架的使用。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐