3.Django3 Web开发 Django 配置信息

0. 第二章 Django 配置信息

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

1. 基本配置信息

创建一个项目, 它的基本配置文件几乎都一样.

1.1 项目路径

from pathlib import Path


BASE_DIR = Path(__file__).resolve().parent.parent
* 1. 项目路径: BASE_DIR: 通过os模块读取项目在当前计算机上的路径.

1.2 密钥配置

# 密钥配置
SECRET_KEY = '^c=aei3w_(!*5bevjmhp_snbo*jw-d^b^cs7=k%1wk+bssius@'
* 2.密钥配置: SECRET_KEY: 一个随机值, 创建项目时自动生成, 主要用于重要的数据加密处理, 提高项目的安全性,
  避免遭到攻击者恶意破坏. 密钥只要用于用户密码, CSRF机制, 会话Session等数据加密.
  2.1 用户密码: Django内置一个Auth认证系统, 该系统具有用户认证和存储用户信息等功能, 在创建用户的时候,
      将用户密码通过密钥镜像加密处理, 保证用户的安全性.
  2.2 CSRF机制: 该机制只要用于表单提交, 防止窃取网站用户信息制造恶意请求.
  2.3 会话Session: Session的信息存放在Cookie中, 以一串随机字符串表示用于标识当前访问站点的用户身份,
      记录相关用户信息.

1.3 调试模式

# 安全警告:不要在生产环境中打开调试的情况下运行!
# 调试模式
DEBUG = True
* 3. 调式模式: DEBUG: 该值为布尔类型.
     在开发调试阶段, 设置为True, 在开发调试过程中会自动检测代码是否发生了更改, 如果更改则重启项目.
     在项目部署上线, 设置为False, 否则会泄露项目的相关信息.

1.4 域名访问权限

# 域名访问权限
ALLOWED_HOSTS = []
* 4. 域名访问权限: ALLOWED_HOSTS: 设置可以访问的域名, 默认值为空列表.
	 当DEBUG为True, 并且ALLOWED_HOSTS为空列表时, 项目允许以localhost  127.0.0.1 在浏览器上访问.
	 当DEBUG为False, ALLOWED_HOSTS为必填项, 否则承运无法启动, 
	 如果想运行所有域名访问, 可设置ALLOWED_HOSTS = ['*']

1.5 App列表

# Application definition
# App列表, 在列表中注册App
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 注册app应用, 写app的名称
    'app01',
]
App列表: INSTALLED_APPS: Django可以运行的App. 在项目创建时已有 admin, auth, session, 等配置信息.
如果在项目中创建的App, 需要添加到App列表中, 否则该App应用就无法使用.
内置应用 说明
admin 内置的后台管理系统.
auth 内置的用户认证系统.
contenttypes 记录项目中所有的model元数据, (Django 的ORM框架).
session Session会话功能, 用于标识当前访问网站的用户身份, 记录用户相关信息.
messages 消息提示功能
staticfiles 查找静态资源路径.

2. 资源文件配置

* 1. 资源文件配置分为 静态资源  媒体资源.
     静态资源的配置方式由配置属性STATIC_URL, STATICFILES_DIRS, STATIC_ROOT进行配置.
     媒体资源的配置方式由配置属性MEDIA_URL, MEDIA_ROOT进行配置.
* 2. 静态资源指的是网站中不会改变的文件. 在一般的应用程序中, 静态资源包括CSS文件, JavaScript文件, 
	 图片等资源文件.
一个项目在开发过程中肯定需要使用CSS和JavaScript文件, 这些静态文件的存放主要由配置文件settings.py配置.

2.1 资源路由

Django默认的静态文件配置信息. 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

# 资源路由
STATIC_URL = '/static/'
配置中设置静态资源的路由地址, 其作用是可以通过浏览器访问Django的静态资源.

资源路由STRTIC_URL的值为'/static/', Django在调试模式(DEBUG=True)
下只能识别项目应用App的static目录下的静态资源. 

当项目启动时, Django会从项目应用App里面查找相关的资源文件, 查找功能主要由App列表的INSTALLED_APPS
的staticfiles实现.

2.2 资源路由测试

* 1. 在app01应用下创建static目录与my_flies目录, 在项目目录下创建static目录, 分别在目录下放置一张图片	 

image-20220331093809380

Django_01/app01/static/python.jpg

image-20220331100547493

Django_01/app01/my_files/mysql.jpg

image-20220404233454258

Django_01/static/go.jpg
* 2. 启动项目
* 3. 在浏览器中输入: 127.0.0.1:8000/static/python.jpg    正常访问到图片资源.

image-20220331094646892

* 4. 在浏览器中输入: 127.0.0.1:8000/my_files/mysql.jpg   404 找不到网页

image-20220331100900237

* 5. 在浏览器中输入: 127.0.0.1:8000/static/go.jpg   404 找不到网页

image-20220404233726836

2.3 资源集合

自定义静态文件夹的路径可以在settings.py配置文件中设置资源集合 STATICFILES_DIRS属性.
默认是不设置的, 需要手动添再配置该属性, 属性的以列表的形式表示, 可以写多个值, 值是一个个的路径.
# 资源集合
STATICFILES_DIRS = [
    # 开发的路径1,
    ...
 	# 开发的路径2,
    ...
]

2.4 资源集合测试

* 1. 修改配置文件settings.py, 开发项目目录下的static目录与项目应用下my_files目录的访问.
STATICFILES_DIRS = [
    # 设置项目目录下的静态资源文件夹static
    BASE_DIR / 'static',
    
    # 设置项目应用下的静态资源文件夹my_files
    BASE_DIR/ 'app01/my_files',
]
* 2. 在浏览器中输入: 127.0.0.1:8000/static/python.jpg  正常访问

image-20220410103226238

* 3. 在浏览器中输入: 127.0.0.1:8000/static/mysql.jpg  正常访问

image-20220410103252523

* 4. 在浏览器中输入: 127.0.0.1:8000/static/go.jpg  正常访问

image-20220410103336951

浏览器访问图片的时候, 图片的路径皆为: 127.0.0.1:8000/static/xxx.jpg
图片路径的static是资源路由设置的值, 若将资源路由设置为 STATIC_URL = '/All_static/', 重启项目后,
图片的路径就是Allstatic.
图片的路径皆为: 127.0.0.1:8000/All_static/xxx.jpg
在STATICFILES_DIRS中设置资源存放的位置, 直接通过STATIC_URL访问即可.

3. 资源部署

STATIC_ROOT 资源部署配置, 在服务器上部署项目, 实现服务器和项目之间的映射.
STATIC_ROOT 主要收集整个项目的静态文件并放在一个新的文件夹, 然后由该文件夹与服务器之间构建映射关系.
STATIC_ROOT = BASE_DIR / 'AllStatic'
当项目的配置属性DEBUG设置为True的时候, Django会自动提供静态文件代理服务. 
此时整个项目处于开发阶段,无序设置.
当项目的配置属性DEBUG设置为False时, 就意味着项目进入生产环境, Django则不在提供静态文件代理服务.
此时需要在配置STATIC_ROOT,.
设置STATIC_ROOT需要使用Django操作指令collectstatic来收集所有静态资源.
这些静态资源都会保存在STATIC_ROOT所设置的文件夹内.

4. 媒体资源

STATIC_URL 是设置静态文件的路由地址, 对于一些经常改动的资源, 通常放置在媒体资源文件夹,
如用户头像, 音乐文件, 用户上传的文件等.
媒体资源和静态资源是可以同时存在的, 而且两者可以独立运行, 互不影响.
媒体资源只能配置属性MEDIA_URL和DEDIA_ROOT.
MEDIA_URL用于设置媒体资源的路由地址, MEDIA_ROOT用于获取media文件夹在计算机系统的完整路径信息.

4.1 媒体资源测试

* 1. 在Django_01项目下创建media文件将, 并存放一张图片learn.jpg.

image-20220410110906854

* 2. 在配置文件中 settings.py 里设置配置属性MEDIA_URL和MEDIA_ROOT
# 设置媒体路由地址信息
MEDIA_URL = '/media/'
# 获取media文件夹的完整路径信息
MEDIA_ROOT = BASE_DIR / 'media'
配置属性后, 还需要将media文件夹注册到Django, 让Django知道如何找到媒体文件, 否则无法在浏览器上访问该文件.
* 3. 在项目名文佳夹的urls.py文件为媒体文件夹media添加相应的路由地址
from django.contrib import admin
from django.urls import path
# 0. 导入项目应用的视图层
from app01 import views

# 2.0 配置媒体文件夹media需要的模块
from django.views.static import serve
from django.conf import settings
from django.urls import re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    # 1. hello_word 功能的路由匹配
    path('hello_word/', views.hello_word),
    # 2.1 配置媒体文件的路由地址
    re_path('media/(?P<path>.*)', serve, {
    
    'document_root': settings.MEDIA_ROOT}, name='media'),
]
* 4. 再次启动Django_01项目, 并在浏览器上访问 127.0.0.1:8000/media/learn.jpg 访问媒体文件.

image-20220410113511594

5. 模板设置

在Web开发中, 模板是一种较为特殊的HTML文档, 这个HTML文档嵌入了一些能够让Django识别的变量和指令,
然后由Django的模板引擎解析这些变量和指令, 生成完整的HTML网页并放回给用户浏览.
模板是Django里面的MTV框架模式的T部分, 配置模板路径是告诉Django在解析模板时, 如何找到模板所在的位置.
创建项目时, 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',
            ],
        },
    },
]
模板配置以列表格式呈现的, 每个元素具有不同的含义:
* 1. BACKEND: 定义模板引擎, 用于识别模板里的变量和指令, 内置的模板引擎有Django Templates和jinja2.
每个模板引擎都有自己的变量和指令语法.
* 2. DIRS: 设置模板所在路径, 告诉Django在那个地方查找模板的位置, 默认为空列表.
* 3. APP_DIRS: 是否在APP里查找模板文件.
* 4. OPTIONS: 用于填充在RequesrContext的上下文(模板里面的变量和指令), 一般情况下不做任何修改.
一般情况下, 只会配置DIRS和APP_DIRS属性的值, templates可以在根目录和每个项目目录下创建.
根目录的templates通常放置公用的模板文件, 能被各个App的模板文件调用, 这个模式符合代码重复使用原则.
使用PyCharm创建项目的时候, 勾选了创建templates文件夹, 会自动配置DIRS的属性值.

5.1 配置演示

* 1. 模板配置通常配置DIRS的属性即可, 在项目的根目录和项目应用app01下分类创建templates文件夹.
     并在文件夹写分别创建文件 index.html和app01_index.html.

2022-04-10_00061

根目录下的index代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>根目录下的index</title>
</head>
<body>
    <h1>根目录下的index</h1>
</body>
</html>
app01下的index代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>app01下的index</title>
</head>
<body>
    <h1>app01目录下的index</h1>
</body>
</html>
* 2. 在配置文件中配置TEMPLATES属性
TEMPLATES = [
    {
    
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 注册根目录与项目App目录下的templates文件夹
        'DIRS': [BASE_DIR / 'templates',
                 BASE_DIR / 'app01/templates'],
        # 开启在App内查找模板文件
        'APP_DIRS': True,
        ...
}]
配置之后, 在视图函数中返回模板页面, 只需要写上页面的名称即可, Django会根据配置信息, 查找模板并返回.
新建一个路由, 在路由返回视图函数, 在视图函数中返回模板页面.
在index视图函数中可以返回根目录templates下的模板文件, 也可以返回App项目templates下的模板文件.
查找顺序, 先从根目录templates下查找, 再去App项目templates下查找.
    # 3. index 的路由匹配
    path('index/', views.index)
# 1. index视图函数
def index(request):
    # 返回index的页面
    # return render(request, 'index.html')
    return render(request, 'app01_index.html')

6. 数据库配置

DATABASES 数据库配置: 只要选择项目所使用的数据库类型
不同的数据库需要设置不同的数据库引擎, 数据引擎用于实现项目与数据库的连接.
DATABASES = {
    
    
    'default': {
    
    
        # 引擎
        'ENGINE': 'django.db.backends.sqlite3',
        # 连接的数据库
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

6.1 引擎

Django提供4种数据库引擎:
* 1. 'django.db.backends.postgresql'
* 2. 'django.db.backends.mysql'
* 3. 'django.db.backends.sqlite3'
* 4. 'django.db.backebds.oracle'
项目创建时默认会使用Sqlite3数据库, 这是一款轻量型的数据库, 常用于嵌入式系统开发, 而占用的资源非常少.
django除了支持PosegreSQL, SQLite3, MySQL, Oracle之外, 还支持 SQL Server  MongoDB的连接.
不同的数据有不同的连接方式.

6.2 创建一个数据库

使用 Navicat Premium 数据库可视化工具创建一个库, django_01.

2022-04-10_00063

创建的库默认是没有表的.

image-20220410143128880

6.3 mysqlclient连接MySQL

Django 2.0 以下版本使用mysqldb作为MySQL的连接模块. 由于mysqldb不支持Python3,
Django 2.0 以上版本不在使用mysqldb作为MySQL的连接模块, 而选择mysqlclient模块.
mysqldb模块与mysqlclient模块两者差异不大, mysqlclient模块需要而外安装.
* 1.1 在PyCharm的Terminal界面输入Django操作指令: pip install mysqlclient  安装mysqlclient模块.
* 1.2 使用pip安装可能报错, 可以先下载mysqlclient模块在本地安装:
	  https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

2022-04-10_00062

将文件复制到D:\Django_test下, 然后代开命令提示符窗口, 使用 pip安装.
pip3 install D:\Django_text/mysqlclient-1.4.6-cp38-cp38-win_amd64.whl
* 2. 完成模块的安装后, 在项目的配置文件中配置MySQL数据库连接信息:
DATABASES = {
    
    
    'default': {
    
    
        # 引擎
        'ENGINE': 'django.db.backends.mysql',
        # 连接的数据库
        'NAME': 'django_01',
        # 登入数据库的用户
        'USER': 'root',
        # 用户的密码
        'PASSWORD': '123',
        # 连接地址
        'HOST': '127.0.0.1',
        # 端口
        'POST': '3306',
    }
}
* 3. 创建Django内置的 Admin后台系统, Auth用户系统和会话机制等功能的数据库.
     在PyCharm的Terminal界面输入Django操作指令: python manage.py migrate 
     将内置的迁移文件生成数据表.  

2022-04-10_00065

* 4. 在可视化工具中查看创建的表.

image-20220410144710331

* 5. 使用mysqlclient连接MySQL数据库时, Django对mysqlclient版本有使用要求, 
     打开Django的源码查看mysqlclient的版本要求.
     D:\Python\Python3.8\Lib\site-packages\django\db\backends\mysql\base.py

2022-04-10_00067

* 6. 一般情况下使用pip安装mysqlclient模块就能符合, Django的使用要求.
     如果在开发过程中发现Django提示mysqlclient过低, 那么可以对Django的源码进行修改, 
     将if version < (1, 4, 0): 注释即可.

6.4 pymysql连接MySQL

* 1. pip 在线安装pymysql:
     在PyCharm的Terminal界面输入Django操作指令: pip install pymysql
* 2. pymysql模块安装成功后, 项目配置文件中的数据信息:
DATABASES = {
    
    
    'default': {
    
    
        # 引擎
        'ENGINE': 'django.db.backends.mysql',
        # 连接的数据库
        'NAME': 'django_01',
        # 登入数据库的用户
        'USER': 'root',
        # 用户的密码
        'PASSWORD': '123',
        # 连接地址
        'HOST': '127.0.0.1',
        # 端口
        'POST': '3306',
    }
}
* 3. 在项目名文件夹下的__init__.py 文件中设置数据库连接模块
# Django_01文件夹的__init__.py
# 导入模块
import pymysql

# 替换Django内置的连接模块
pymysql.install_as_MySQLdb()
* 4. 此时连接的库之前使用过用表存在, 使用 Navicat Premium 数据库可视化工具将所有的表删除.

image-20220410162656527

* 5. 在PyCharm的Terminal界面输入Django操作指令: python manage.py migrate 
     将内置的迁移文件生成数据表.  

2022-04-10_00068

如果使用的MySQL是8.0以上的版本, 在Django连接MySQL数据库时会提示 dajngo.db.utils.OperationalError的错误信息.
MySQL 8.0 版本以上的密码加密方式采用CHA2. 解决报错信息的方法: 将加密方式改回以前的加密方式.
在Navicat Premium 数据库可视化工具中运行修改密码的SQL语句:
# newpassword 为用户设置新密码
ALTER USER 'root'@'locahost' IDENTIFIED WITH mysql_native_password BY '新密码';
# 刷新缓存
FLUSH PRIVILEGES;

2022-04-10_00069

6.5 多个数据库的连接

在一个项目里可能需要使用多个数据库才能满足开需求, 特别对与数据量过大的系统,
单个数据库存储的数据越多就会使得服务器负载越大, 因为会将数据库划分成多个数据库服务器共同存储.
若django想利用这些数据开发功能系统, 则需要对各个数据库服务器进行连接.
配置文件中的DATABASES属性中设置多对值即可实现多个数据库的连接.
配置数据DATABASES设置三个键值对, 每个键值对代码Django连接了某个数据库.
DATABASES = {
    
    
    # 第一个数据库
    'default': {
    
    
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'sqlite3',
    },

    # 第二个数据库
    'MyDjango1': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_01',
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': '127.0.0.1',
        'POST': '3306',
    },
    # 第三个数据库
    'MyDjango2': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_01',
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': '127.0.0.1',
        'POST': '3306',
    },
}
连接三个数据库, sqlite3, django_01, django_02.前者属于Sqlite3数据库系统, 后两者属于MySQL数据库系统.
若项目中连接了多个数据库, 则数据库之间的使用需要遵从一定的规则和设置, 
比如项目中定义了多个模型, 每个模型所对应的数据表可以选择在某个数据库中生成, 
如果模型没有指向某个数据库, 模型就会在key为default的数据库中生成.

6.6 动态连接数据库

使用配置文件动态连接数据库
在大多数情况下, 都是在配置文件中配置数据库的连接方式, 每次修改配置文件的属性, 都需要重新启动Dajngo,
否则修改内容就无法生效.
当项目运行上线之后, 为了保证在系统不中断的情况下切换到另一个数据库, 可以将数据库的连接方式写到配置文中,
这样无须修改settings.py的配置属性便可以顺利切换数据的目的.
1. 连接测试
* 1. 在项目名文件夹下创建配置文件my.cnf, 然后在配置文件中写入MqSQL数据库的连接信息.
# my.cnf 文件
[client]
database=django_01
user=root
password=123
host=127.0.0.1
port=3306
注意点:
  Django使用配置文件连接数据库, 必须保证项目的路径不能出现中文, 否则Django无法连接数据库并抛出异常
  提示OperationalError异信息.
* 2. 配置文件my.cnf中必须设置[client], [client]在配置信息中代表分组的意思, 
     它是将一个或对个配置信息划分到某一个分组里面. [client]里面, 
     每个配置信息分别代表MySQL的数据库名称, 用户名, 密码, IP地址和端口信息.
* 3. 在Django配置文件settings.py中编码DATABASES的配置信息.
     DATABASES> default > OPTIONS > read_default_file中设置配置文件的地址.
     Django会自动读取配置文件的数据库连接信息, 从而实现数据库连接.
DATABASES = {
    
    
	'default':{
    
    
		'ENGINE': 'django.db.backends.mysql',
		'OPTIONS': {
    
    'read_default_file': str(BASE_DIR / 'my.cnf')},
	}
}

2022-04-11_00074

* 4. 删除之前删除的表

2022-04-11_00072

* 5. 执行数据迁移命令生成表

2022-04-11_00073

* 6. 数据表被重新生成了

image-20220411234506843

6.7 通过SSH隧道远程连接MySQL

在企业开发中, 数据库和Web系统很可能部署在不同的服务器, 当Web系统连接数据库的时候, 如果数据库所在的服务器
禁止了外网直连, 只允许通过SSH方式连接服务器, 再从以连接服务器的基础上连接数据库.
Navicat Premium中通过SSH连接服务器
* 1. 新建连接 --> MySQL --> 弹出新建连接页面 --> 选择SSH选项 
	 在SSH连接界面输入服务器的连接信息
在连接的时候先点测试连接在, 在测试成功之后再点确定
**我没有远程的服务器就不连接了**

2022-04-11_00076

* 2. 然后切换到常规页面, 输入服务器中MySQL的连接信息

2022-04-12_00078

Django通过SSH方式连接数据库, Django中需要先下载sshtunnel模块, 该模块能通过SSH方式连接目标服务器, 生成
服务器的SSH连接对象, 然后在Django的配置文件settings.py的DATABASES中设置数据库连接.
# 数据服务器的ip地址或主机名
ssh_host = 'xxxx.xxxx.xxxx.xxx'
# 数据库服务器的SSH连接端口号一般都是22, 必须是数字
ssh_port = 22
# 数据库服务器的用户名
ssh_user = 'root'
# 数据库服务器分用户密码
ssh_passeord = '123'
# 数据库服务器连接的mysql主机名或ip
mysql_host = 'localhost'
# 数据库服务器的mysql的端口, 默认为3306, 必须是数字
mysql_port = 3306
# 数据库服务器的mysql的用户名
mysql_user = 'root'
# 数据库服务器的mysql的用户密码
mysql_password = '123'
# 数据库服务器的mysql的数据库名
mysql_db = 'django_01'

from sshtunnel import open_tunnel
def get_ssh():
    server = open_tynnel(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
	    ssh_password=ssh_password,
        # 绑定服务器的MySQL数据库
        remote_bind_address=(mysql_host, mysql_port)
    )
    
   # ssh通道服务器启动
	server_start()
    return str(server.local_bind_port)

DATABASES = {
    
    
    'default': {
    
    
        'ENFINE': 'django.db.backends.mysql',
        'NAME': mysql_db,
        'USER': mysql_user,
        'PASSWORD': mysql_password,
        'HOST': mysql_host,
        'PORT': get_ssh(),
    }
}
设置两组不同的IP地址:
* 1. ssh_开头的配置信息是实现SSH连接目标服务器, 只要是在sshtunnel模块中使用
* 2. mysql_开头的配置信息是在目标服务基础上连接MySQL数据库, 在配置属性DATABSES和sshtunnel模块中均使用.
Django使用SSH连接服务器的MySQL过程如下:
* 1. 分别定义服务器的SSH连接信息个数据库的连接信息.
* 2. 定义服务器的SSH连接函数get_ssh(), 使用sshtunnel模块的open_tunnel函数实现, 并设置相应的函数参数,
	 其中参数remote_bind_address是绑定服务器的MySQL数据库.
* 3. 在配置属性DATABASES的PORT调用get_ssh(), Django自动根据DATABASES的PORT连接到数据库的MySQL数据库.

7. 中间件

用户向网站发送HTTP请求(Request), 网站的服务端会根据用户的操作返回响应处理(Response), 
响应处理最后被服务端渲染成一个HTML的静态文件返回给用户.
中间件(Middleware): 是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子, 是一个轻量, 
低级别的插件系统, 用于在全局范围内改变Django的输入和输出.
中间件的作用就是处理用户的请求信息和返回响应内容.

img

请求到响应的过程: 
* 1. 首先经过中间件处理请求信息, 经过所有中间件的process_request执行相关的处理, 再到Django的路由层.
* 2. 路由匹配之后执行所有中间件process_view进入到视图函数, 执行视图函数的逻辑, 之后返回渲染后的页面. 
* 3. 返回的时候经过process_exception, process_template_response, process_response
配置属性MIDDLEWARE的数据格式为类型类型, 每个中间的设置顺序是固定的, 
前面的中间件对数据进行加工处理, 之后交给下一个中间件进行处理, 如果随意改变中间件会导致程序异常.
开发者可以根据自己的需要自定义中间件, 之后将自定义的中间件添加到配置文件的MIDDLEWARE属性中激活.
# 中间件配置列表
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 添加LocaleMiddleware 内置功能支持中文显示
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
* 1. SecurityMiddleware 内置安全机制, 保护用户与网站的通信安全.
* 2. SessionMiddleware 会话Session功能
* 3. LocaleMiddleware 国际化和本地化功能
* 4. CommonMiddleware 处理请求信息, 规范请求化内容
* 5. CsrfViewMiddleware 开启CSRF防护功能
* 6. AuthenticationMiddleware 开启内置的用户认证系统
* 7. MessageMiddleware 开启内置的信息提示功能
* 8. XFrameOptionsMiddleware 防止恶意程序单击劫持

猜你喜欢

转载自blog.csdn.net/qq_46137324/article/details/124142119