2. Django配置信息

2024-04-06_231835

第2章 Django配置信息

Django的配置文件settings.py用于配置整个网站的环境和功能, 
核心配置必须有项目路径, 密钥配置, 域名访问权限, App列表, 中间件, 资源文件, 模板配置, 数据库的连接方式.* 项目运行时, 如果修改代码, 项目会自动检测发现改动后会重新运行, 除非报错否则无序手动重启项目.

2.1 基本配置信息

一个简单的项目必须具备的基本配置信息有: 项目路径, 密钥配置, 域名访问权限, App列表和中间件.
以MyDjango项目为例, settings.py的基本配置如下:
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# 密钥配置
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '@p_m^!ha=$6m$9#m%gobzo&b0^g2obt4teod84xs6=f%$4a66x'
# SECURITY WARNING: don't run with debug turned on in production!# 调试模式
DEBUG = True# 域名访问权限
ALLOWED_HOSTS = []# App列表
# Application definition
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]
上述代码列出了项目路径BASE_DIR, 密钥配置SECRET_KEY, 调试模式DEBUG, 
域名访问权限ALLOWED_HOSTS和App列表INSTALLED_APPS, 各个配置说明如下:* 1. 项目路径BASE_DIR: 主要通过os模块(从Python 3.4开始, 是pathlib模块)读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成, 一般情况下无须修改.* 2. 密钥配置SECRET_KEY: 这是一个随机值, 在项目创建的时候自动生成, 一般情况下无须修改.主要用于重要数据的加密处理, 提高项目的安全性, 避免遭到攻击者恶意破坏.密钥主要用于用户密码, CSRF机制和会话Session等数据加密. 用户密码: Django内置一套Auth认证系统, 该系统具有用户认证和存储用户信息等功能,在创建用户的时候, 将用户密码通过密钥进行加密处理, 保证用户的安全性. CSRF机制: 该机制主要用于表单提交, 防止窃取网站的用户信息来制造恶意请求. 会话Session: Session的信息存放在Cookie中, 以一串随机的字符串表示, 用于标识当前访问网站的用户身份, 记录相关用户信息.* 3. 调试模式DEBUG: 该值为布尔类型. 如果在开发调试阶段, 那么应设置为True,在开发调试过程中会自动检测代码是否发生更改, 根据检测结果执行是否刷新重启系统.如果项目部署上线, 那么应将其改为False, 否则会泄漏项目的相关信息.* 4. 域名访问权限ALLOWED_HOSTS: 设置可访问的域名, 默认值为空列表.当DEBUG为True并且ALLOWED_HOSTS为空列表时, 项目只允许以localhost或127.0.0.1在浏览器上访问.当DEBUG为False时, ALLOWED_HOSTS为必填项, 否则程序无法启动, 如果想允许所有域名访问, 可设置ALLOW_HOSTS = ['*'].* 5. App列表INSTALLED_APPS: 告诉Django有哪些App.在项目创建时已有admin, auth和sessions等配置信息, 这些都是Django内置的应用功能, 各个功能说明如下: admin: 内置的后台管理系统. auth: 内置的用户认证系统. contenttypes: 记录项目中所有model元数据(Django的ORM框架). sessions: Session会话功能, 用于标识当前访问网站的用户身份, 记录相关用户信息. messages: 消息提示功能. staticfiles: 查找静态资源路径.如果在项目中创建了App, 就必须在App列表INSTALLED_APPS添加App名称.将MyDjango项目已创建的App添加到App列表, 代码如下:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','index',
]

2.2 资源文件配置

资源文件配置分为静态资源和媒体资源.
静态资源的配置方式由配置属性STATIC_URL, STATICFILES_DIRS和STATIC_ROOT进行设置;
媒体资源的配置方式由配置属性MEDIA_URL和MEDIA_ROOT决定.

2.2.1 资源路由–STATIC_URL

静态资源指的是网站中不会改变的文件.
在一般的应用程序中, 静态资源包括CSS文件, JavaScript文件以及图片等资源文件. 
此处简单介绍CSS和JavaScript文件.CSS也称层叠样式表(Cascading Style Sheets), 
是一种用来表现HTML(标准通用标记语言的一个应用)或XML)标准通用标记语言的一个子集)等文件样式的计算机语言.
CSS不仅可以静态地修饰网页, 还可以配合各种脚本语言动态地对网页各元素进行格式化.JavaScript是一种直译式脚本语言, 也是一种动态类型, 弱类型, 基于原型的语言, 内置支持类型.
它的解释器被称为JavaScript引擎, 为浏览器的一部分, 广泛用于客户端的脚本语言,
最早是在HTML(标准通用标记语言下的一个应用)网页上使用的, 用来给HTML网页增加动态功能.一个项目在开发过程中肯定需要使用CSS和JavaScript文件,
这些静态文件的存放主要由配置文件settings.py设置, Django默认配置信息如下:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
上述配置是设置静态资源的路由地址, 其作用是通过浏览器访问Django的静态资源.
默认情况下, Django只能识别项目应用App的static文件夹里面的静态资源.
当项目启动时, Django会从项目应用App里面查找相关的资源文件, 查找功能主要由App列表INSTALLED_APPS的staticfiles实现.
在index中创建static文件夹并在文件夹中放置图片dog.jpg, 如图2-1所示.

2024-04-05_205043

2024-04-05_210059

2024-04-05_205312

2-1 创建static文件夹
Django在调试模式(DEBUG=True)下只能识别项目应用App的static文件夹里面的静态资源, 
如果该文件夹改为其他名字, Django就无法识别, 若将static文件夹放在MyDjango的项目目录下, 
则Django也是无法识别的, 如图2-2所示.

2024-04-05_205726

2024-04-05_210241

2024-04-05_210410

2-2 static的路径设置
为了进一步验证Django在调试模式(DEBUG=True)下只能识别项目应用App的static文件夹.
我们在index文件夹里创建Mystatic文件夹并放置图片cow.jpg, 
在MyDjango的根目录下创建static文件夹并放置图片duck.jpg.
最终, 整个MyDjango的静态资源文件夹有: static(在index文件夹),
Mystatic(在index文件夹)和static(在MyDjango的根目录), 如图2-3所示.

2024-04-05_210847

2-3 静态资源文件夹
启动MyDjango并在浏览器上分别访问:
* 1: http://127.0.0.1:8000/static/dog.jpg ,
* 2: http://127.0.0.1:8000/static/duck.jpg ,
* 3. http://127.0.0.1:8000/static/cow.jpg ,
可以发现只有dog.jpg能正常访问, 而duck.jpg和cow.jpg无法访问, 如图2-4所示.

2024-04-05_211521

2-4 访问静态资源
从上述例子说明, 若资源路由STATIC_URL的值为/static/, 则浏览器访问静态资源的网站必须为static, 
否则无法访问, 并且Django在调试模式(DEBUG=True)下只能识别App目录下的static文件夹.

2.2.2 资源集合–STATICFILES_DIRS

由于STATIC_URL的特殊性, 在开发中会造成诸多不便, 比如将静态文件夹存放在项目的根目录以及定义多个静态文件夹等.
以MyDjango为例, 若想在网页上正常访问图片duck.jpg和cow.jpg,
可以将根目录的static文件夹和index的Mystatic文件夹写入资源集合STATICFILES_DIRS.
在配置文件settings.py中设置STATICFILES_DIRS属性.该属性以列表的形式表示, 设置方式如下:
# 资源集合
STATICFILES_DIRS = [# 设置根目录的静态资源文件夹staticBASE_DIR / 'static',# 设置App (index)的静态资源文件夹MystaticBASE_DIR / 'index/Mystatic',
]

2024-04-05_213032

再次启动MyDjango并在浏览器上分别访问图片dog.jpg, duck.jpg和cow.jpg, 可以发现三者都能正常访问, 如图2-5所示.

2024-04-05_212704

2-5 访问静态资源
浏览器访问图片的时候, 图片路径皆为http://127.0.0.1:8000/static/xxx.jpg, 
图片路径的static是指资源路径STATIC_URL的值, 若将STATIC_URL的值改为Allstatic,
则再次重启MyDjango项目并在浏览器上将图片资源路径的static改为Allstatic即可, 如图2-6所示.
STATIC_URL = '/Allstatic/'
访问: 
* 1: http://127.0.0.1:8000/Allstatic/dog.jpg ,
* 2: http://127.0.0.1:8000/Allstatic/duck.jpg ,
* 3. http://127.0.0.1:8000/Allstatic/cow.jpg .

2024-04-05_220246

2024-04-05_220527

2-6 修改图片路由地址

2.2.3 资源部署–STATIC_ROOT

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

2.2.4 媒体资源–MEDIA

一般情况下, STATIC_URL是设置静态文件的路由地址, 如CSS样式文件, JavaScript文件以及常用图片等.
对于一些经常变动的资源, 通常将其存放在媒体资源文件夹, 如用户头像, 歌曲文件等.媒体资源和静态资源是可以同时存在的, 而且两者可以独立运行, 互不影响, 而媒体资源只有配置属性MEDIA_URL和MEDIA_ROOT.
以MyDjango为例, 在MyDjango的根目录下创建media文件夹并存放图片monkey.jpg, 如图2-7所示.

2024-04-05_222057

2-7 创建media文件夹
然后在配置文件settings.py里设置配置属性MEDIA_URL和MEDIA_ROOT,
MEDIA_URL用于设置媒体资源的路由地址, MEDIA_ROOT用于获取media文件夹在计算机系统的完整路径信息, 如下所示:
# 设置媒体路由地址信息
MEDIA_URL = '/media/'
# 获取media文件夹的完整路径信息
MEDIA_ROOT = BASE_DIR / 'media'
配置属性设置后, 还需要将media文件夹注册到Django里, 让Django知道如何找到媒体文件, 否则无法在浏览器上访问该文件夹的文件信息.
打开MyDjango文件夹的urls.py文件, 为媒体文件夹media添加相应的路由地址, 代码如下:

2024-04-05_222939

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

2024-04-05_224837

最后再次启动MyDjango, 并在浏览器上访问:
* 1. http://127.0.0.1:8000/media/monkey.jpg ,
* 2. http://127.0.0.1:8000/allstatic/dog.jpg ,
发现两者皆可正常访问, 如图2-8所示.

2024-04-05_231024

2-8 访问媒体文件

2.3 模板配置

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

2024-04-05_231901

模板配置是以列表格式呈现的, 每个元素具有不同的含义, 其含义说明如下:
 BACKEND: 定义模板引擎, 用于识别模板里面的变量和指令.内置的模板引擎有Django Templates和jinja2.Jinja2, 每个模板引擎都有自己的变量和指令语法.
 DIRS: 设置模板所在路径, 告诉Django在哪个地方查找模板的位置, 默认为空列表.
 APP_DIRS: 是否在App里查找模板文件.
 OPTIONS: 用于填充在RequestContext的上下文(模板里面的变量和指令), 一般情况下不做任何修改.
模板配置通常配置DIRS的属性值即可, 在项目的根目录和index下分别创建templates文件夹,
并在文件夹下分别创建文件index.html和app_index.html, 如图2-9所示.

2024-04-05_232520

2-9 设置模板文件夹
一般情况下, 根目录的templates通常存放共用的模板文件, 能为各个App的模板文件调用, 这个模式符合代码重复使用原则.
根据图2-9的文件夹设置, 配置属性TEMPLATES的配置信息如下:
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates',# 注册根目录和 index 的 templates 文件夹'DIRS': [BASE_DIR / 'templates',BASE_DIR / 'index/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',],},},
]

2024-04-05_233140

2.4 数据库配置

本节讲述如何使用mysqlclient和pymysql模块实现Django与MySQL数据库通信连接, 并且简单介绍单个项目实现多个数据库连接方式.

2.4.1 mysqlclient连接MySQL

数据库配置是选择项目所使用的数据库的类型, 不同的数据库需要设置不同的数据库引擎, 
数据库引擎用于实现项目与数据库的连接, Django提供4种数据库引擎:
 'django.db.backends.postgresql'
 'django.db.backends.mysql'
 'django.db.backends.sqlite3'
 'django.db.backends.oracle'
项目创建时默认使用Sqlite3数据库, 这是一款轻型的数据库, 常用于嵌入式系统开发, 而且占用的资源非常少.
Sqlite3数据库配置信息如下:
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}

image-20240405234251893

如果把上述的连接信息改为MySQL数据库, 首先安装MySQL连接模块, 由于mysqldb不支持Python 3,
因此Django 2.0以上版本不再使用mysqldb作为MySQL的连接模块, 而选择mysqlclient模块, 但两者之间在使用上并没有太大的差异.
在配置MySQL之前, 需要安装mysqlclient模块.
这里以pip安装方法为例, 打开命令提示符窗口并输入安装指令: pip install mysqlclient, 等待模板安装完成即可.
# 使用这个:
pip install mysqlclient==1.4.6 -i https://pypi.tuna.tsinghua.edu.cn/simple mysqlclient 

image-20240405235526741

如果使用pip在线安装mysqlclient的过程中出现错误, 就可以选择whl文件安装.
在浏览器访问www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient并下载与Python版本相匹配的mysqlclient文件.
我们将mysqlclient文件下载保存在D盘, 然后打开命令提示符窗口, 使用pip完成whl文件安装, 如下所示:
pip install D:\mysqlclient-1.4.6cp37-cp37m-win_amd64.whl
完成mysqlclient模块的安装后, 在项目的配置文件settings.py中配置MySQL数据库连接信息, 代码如下:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_db','USER': 'root','PASSWORD': '1234','HOST': '127.0.0.1','PORT': '3306'}
}

image-20240406000339008

为了验证数据库连接信息是否正确, 我们使用数据库可视化工具Navicat Premium打开本地的MySQL数据库.
在本地的MySQL数据库创建数据库django_db, 如图2-10所示.

image-20240406002300647

2-10 数据库django_db
刚创建的数据库django_db是一个空白的数据库,
接着在PyCharm的Terminal界面下输入Django操作指令python manage.py migrate来创建Django内置功能的数据表.
因为Django自带内置功能, 如Admin后台系统, Auth用户系统和会话机制等功能, 这些功能都需要借助数据表实现,
所以该操作指令可以将内置的迁移文件生成数据表, 如图2-11所示.

image-20240406204538321

2-11 创建数据表
最后在数据库可视化工具Navicat Premium里查看数据库django_db是否生成相应的数据表, 如图2-12所示.

image-20240406204119272

image-20240406192716176

2-12 查看数据表
使用mysqlclient连接MySQL数据库时, Django对mysqlclient版本有使用要求,
打开Django的源码查看mysqlclient的版本要求, 如图2-13所示.

2024-04-06_194239

2-13 mysqlclient版本要求
一般情况下, 使用pip安装mysqlclient模块就能符合Django的使用要求.
如果在开发过程中发现Django提示mysqlclient过低, 那么可以对Django的源码进行修改, 将图2-13的if条件判断注释即可.

2.4.2 pymysql连接MySQL

除了使用mysqlclient模块连接MySQL之外, 还可以使用pymysql模块连接MySQL数据库.
pymysql模块的安装使用pip在线安装即可, 在命令提示符窗口下输入pip install pymysql指令并等待安装完成即可.
pymysql模块安装成功后, 项目配置文件settings.py的数据库配置信息无须修改,
只要在MyDjango文件夹的__init__.py中设置数据库连接模块即可, 代码如下:
# MyDjango文件夹的__init__.py
import pymysql
pymysql.install_as_MySQLdb()
若要验证pymysql模块连接MySQL数据库的功能, 建议读者先将mysqlclient模块先行卸载, 
这样能排除干扰因素, 而验证方式与mysqlclient模块连接MySQL的验证方式一致.
记得在验证之前, 务必将数据库django_db的数据表删除, 具体的验证过程不再重复讲述.
值得注意的是, 如果读者使用的MySQL是8.0以上版本, 
在Django连接MySQL数据库时会提示django.db.utils.OperationalError的错误信息,
这是因为MySQL 8.0版本的密码加密方式发生了改变, 8.0版本的用户密码采用的是CHA2加密方式.
为了解决这个问题, 我们通过SQL语句将8.0版本的加密方式改回原来的加密方式,
这样可以解决Django连接MySQL数据库的错误问题.
在MySQL的可视化工具中运行以下SQL语句:
# newpassword是已设置的用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
FLUSH PRIVILEGES;
Django除了支持PostgreSQL, SQLite3, MySQL和Oracle之外, 还支持SQL Server和MongoDB的连接.
由于不同的数据库有不同的连接方式, 因此此处不过多介绍, 本书主要以MySQL连接为例,
若需了解其他数据库的连接方式, 则可自行搜索相关资料.

2.4.3 多个数据库的连接方式

在一个项目里可能需要使用多个数据库才能满足开发需求, 特别对于数据量过大的系统,
单个数据库存储的数据越多就会使服务器负载越大, 因此会将数据划分成多个数据库服务器共同存储,
若Django想利用这些数据开发功能系统, 则需要对各个数据库服务器进行连接.
从Django单个数据库连接信息看到, 配置属性DATABASES的属性值是以字典的格式表示的, 字典里的每一对键值代表连接某一个数据库.
因此, 我们在配置属性DATABASES里设置多对键值对即可实现多个数据库连接, 实现代码如下:
DATABASES = {# 第一个数据库'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_db','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': '3306',},# 第二个数据库'MyDjango': {'ENGINE': 'django.db.backends.mysql','NAME': 'mydjango_db','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': '3306',},# 第三个数据库'MySqlite3': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'sqlite3',}
}

image-20240406195929504

上述代码共连接了三个数据库,分别是django_db, mydjango_db和sqlite3.
django_db和mydjango_db均属于MySQL数据库系统, sqlite3属于Sqlite3数据库系统.
配置属性DATABASES设有3个键值对: default, MyDjango和MySqlite3, 每个键值对代表Django连接了某个数据库.若项目中连接了多个数据库, 则数据库之间的使用需要遵从一定的规则和设置.
比如项目中定义了多个模型, 每个模型所对应的数据表可以选择在某个数据库中生成, 
如果模型没有指向某个数据库, 模型就会在key为default的数据库里生成.

2.4.4 使用配置文件动态连接数据库

在大多数情况下, 我们都是在settings.py中配置数据库的连接方式, 
但每次修改settings.py的配置属性都要重新启动Django, 否则修改内容就无法生效.当项目运行上线之后, 为了保证在系统不中断的情况下切换到另一个数据库, 
可以将数据库的连接方式写到配置文件中, 这样无须修改settings.py的配置属性即可达成顺利切换数据的目的.我们在MyDjango的目录下创建配置文件my.cnf, 然后在配置文件my.cnf写入MySQL数据库的连接信息, 代码如下所示:
# my.cnf
[client]
database=django_db
user=root
password=123456
host=127.0.0.1
port=3306

image-20240406200631715

配置文件my.cnf中必须设置[client], [client]在配置信息中代表分组的意思, 它是将一个或多个配置信息划分到某一个分组里面.
[client]里面, 每个配置信息分别代表MySQL的数据库名称, 用户名, 密码, IP地址和端口信息.
下一步在Django的配置文件settings.py中编写DATABASES的配置信息, 其代码如下:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','OPTIONS': {'read_default_file': str(BASE_DIR / 'my.cnf')}},
}

2024-04-06_203549

从DATABASES的配置信息看到, 我们只需在default->OPTIONS->read_default_file设置配置文件my.cnf的地址路径即可,
Django会自动读取配置文件my.cnf的数据库连接信息, 从而实现数据库连接.为了验证能否使用配置文件my.cnf实现数据库连接, 在MyDjango2的urls.py中设置路由indexView,
路由的视图函数indexView()在项目应用index的view.py中定义, 代码如下:
# MyDjango2的urls.py
from django.contrib import admin
from django.urls import path
# 导入项目应用index
from index.views import indexView
urlpatterns = [path('admin/', admin.site.urls),path('', indexView, name='index')
]
在项目应用index的view.py中定义路由index的视图函数indexView(), 代码如下:
from django.shortcuts import render
from django.contrib.contenttypes.models import ContentTypedef indexView(request):c = ContentType.objects.values_list().all()print(c)return render(request, 'index.html')
视图函数indexView()读取并输出Django内置模型ContentType的数据, 并从模板文件夹templates的index.html作为当前请求的响应内容.
启动MyDjango之前, 需要使用Django内置指令创建数据表, 打开PyChram的Terminal窗口, 
确保窗口的当前路径是MyDjango目录, 然后输入python manage.py migrate指令, Django会自动创建内置数据表, 如图2-14所示.
# 提示: 直接执行会提示没有任何待应用的迁移文件,
# 因为这个库中已经执行过python manage.py migrate生成过表格, 且没有任何改动.
PS D:\MyDjango2> python manage.py migrate
Operations to perform:Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:No migrations to apply.# 需要先将所有表格删除后, 才能执行成功.

2-14 创建数据表
数据表创建成功后, 我们启动MyDjango, 然后在浏览器访问: http://127.0.0.1:8000/ ,
在PyChram的Run窗口下看到当前的请求信息以及视图函数indexView()输出模型ContentType的数据信息, 如图2-15所示.

2024-04-06_205134

2-15 输出信息
注意: Django使用配置文件my.cnf连接数据库, 必须确保项目的绝对路径不能出现中文,
否则Django无法连接数据库并提示OperationalError异常信息, 如图2-16所示.
* 1. 在d盘下新建文件夹'使用配件文件动态连接数据库'.
* 2. 复制一份Django项目到改文件下.
* 3. 打开项目并运行.

image-20240406205919295

2024-04-06_210047

2-16 异常信息

2.4.5 通过远程连接MySQL

在企业开发中, 数据库和Web系统很可能部署在不同的服务器, 当Web系统连接数据库的时候, 
如果数据库所在的服务器禁止了外网直连, 只允许通过SSH方式连接服务器, 再从已连接服务器的基础上连接数据库, 
遇到这一种情况, 如何在Django中实现数据库连接呢?为了清楚理解SSH连接数据库的实现过程, 我们使用数据库可视化工具Navicat Premium演示如何通过SSH连接数据库.
首先打开Navicat Premium连接MySQL的界面, 然后单击'SSH'选项, 在SSH连接界面输入服务器的连接信息, 如图2-17所示.

image-20240406211118249

image-20240406211521395

2-17 SSH连接信息
然后切换到'常规'界面, 输入服务器里面MySQL的连接信息, 如图2-18所示.
最后单击'确定'按钮即可完成整个连接过程.

image-20240406212041307

2-18 MySQL连接信息
既然数据库只允许SSH方式连接, 我们只能通过这种方式实现数据库连接,
首先使用pip指令下载sshtunnel模块, 该模块能通过SSH方式连接到目标服务器, 生成服务器的SSH连接对象
然后在Django的配置文件settings.py的DATABASES中设置数据库连接, 实现过程如下:
# 数据库服务器的ip地址或主机名
ssh_host = "XXX.XXX.XXX.XXX"
# 数据库服务器的SSH连接端口号, 一般都是22, 必须是数字
ssh_port = 22
# 数据库服务器的用户名
ssh_user = "root"
# 数据库服务器的用户密码
ssh_password = "123456"# 数据库服务器的mysql的主机名或ip地址
mysql_host = "localhost"
# 数据库服务器的mysql的端口, 默认为3306, 必须是数字
mysql_port = 3306
# 数据库服务器的mysql的用户名
mysql_user = "root"
# 数据库服务器的mysql的密码
mysql_password = "123456"
# 数据库服务器的mysql的数据库名
mysql_db = "mydjango"from sshtunnel import open_tunnel
def get_ssh():server = open_tunnel((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': {'ENGINE': '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数据库, 在配置属性DATABASES和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数据库.

2.5 中间件

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

2024-04-06_220942

2-19 中间件的执行流程
从图2-19中能清晰地看到, 中间件的作用是处理用户请求信息和返回响应内容.
开发者可以根据自己的开发需求自定义中间件, 只要将自定义的中间件添加到配置属性MIDDLEWARE中即可激活.
一般情况下, Django默认的中间件配置均可满足大部分的开发需求.
我们在项目的MIDDLEWARE中添加LocaleMiddleware中间件, 使得Django内置的功能支持中文显示, 代码如下:
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',
]
配置属性MIDDLEWARE的数据格式为列表类型, 每个中间件的设置顺序是固定的, 如果随意变更中间件, 就很容易导致程序异常.
每个中间件的说明如下:
 SecurityMiddleware: 内置的安全机制, 保护用户与网站的通信安全.
 SessionMiddleware: 会话Session功能.
 LocaleMiddleware: 国际化和本地化功能.
 CommonMiddleware: 处理请求信息, 规范化请求内容.
 CsrfViewMiddleware: 开启CSRF防护功能.
 AuthenticationMiddleware: 开启内置的用户认证系统.
 MessageMiddleware: 开启内置的信息提示功能.
 XFrameOptionsMiddleware: 防止恶意程序单击劫持.

2.6 本章小结

项目配置是根据实际开发需求对整个Web框架编写相关配置信息.
配置信息主要由项目的settings.py实现, 主要配置有项目路径, 密钥配置, 
域名访问权限, App列表, 配置静态资源, 配置模板文件, 数据库配置, 中间件和缓存配置.当DEBUG为True并且ALLOWED_HOSTS为空时, 项目只允许以localhost或127.0.0.1在浏览器上访问.
当DEBUG为False时, ALLOWED_HOSTS为必填项, 否则程序无法启动, 如果想允许所有域名访问, 那么可设置ALLOW_HOSTS = ['*'].App列表INSTALLED_APPS的各个功能说明如下:
 admin: 内置的后台管理系统.
 auth: 内置的用户认证系统.
 contenttypes: 记录项目中所有model元数据(Django的ORM框架).
 sessions: Session会话功能, 用于标识当前访问网站的用户身份, 记录相关用户信息.
 messages: 消息提示功能.
 staticfiles: 查找静态资源路径.资源文件配置分为静态资源和媒体资源. 
静态资源指的是网站中不会改变的文件. 在一般的应用程序中, 静态资源包括CSS文件, JavaScript文件以及图片等资源文件;
媒体资源是指经常变动的资源, 通常将其存放在媒体资源文件夹, 如用户头像, 歌曲文件等.静态资源的配置属性包括: STATIC_URL, STATICFILES_DIRS和STATIC_ROOT, 三者说明如下:
 STATIC_URL: 设置静态资源的路由地址.
 STATICFILES_DIRS: 将项目里自定义的静态资源文件夹绑定到Django里.
 STATIC_ROOT: 收集整个项目的静态资源并存放在一个新的文件夹, 然后由该文件夹与服务器之间构建映射关系.媒体资源的配置属性包括: MEDIA_URL和MEDIA_ROOT, 说明如下:
 MEDIA_URL: 设置媒体资源的路由地址.
 MEDIA_ROOT: 获取项目里自定义的媒体资源文件的文件路径.模板信息是以列表格式呈现的, 每个元素具有不同的含义, 其含义说明如下:
 BACKEND: 定义模板引擎, 用于识别模板里面的变量和指令.内置的模板引擎有DjangoTemplates和jinja2.Jinja2, 每个模板引擎都有自己的变量和指令语法.
 DIRS: 设置模板所在的路径, 告诉Django在哪个地方查找模板的位置, 默认为空列表.
 APP_DIRS: 是否在App里查找模板文件.
 OPTIONS: 用于填充在RequestContext的上下文(模板里面的变量和指令), 一般情况下不做任何修改.Django可以选择不同的模块连接MySQL, 但配置信息有固定的写法, 如下所示:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_db','USER': 'root','PASSWORD': '1234','HOST': '127.0.0.1','PORT': '3306'}
}
中间件由属性MIDDLEWARE完成配置, 属性MIDDLEWARE的数据格式为列表类型,
每个中间件的设置顺序是固定的, 如果随意变更中间件, 就很容易导致程序异常.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat管理配置

Tomcat管理配置 1 host-manager项目2 manager项目 Tomcat 提供了Web版的管理控制台&#xff0c;位于webapps目录下。Tomcat 提供了用于管理Host的host-manager和用于管理Web应用的manager。 1 host-manager项目 Tomcat启动之后&#xff0c;可以通过 http://localhost:8080/ho…

Android 的网络加载

发起网络请求的过程 当用户在应用程序中输入网址或关键字时&#xff0c;应用程序会发起网络请求。这个过程大致如下&#xff1a; 应用程序将请求发送到服务器&#xff0c;服务器返回响应数据。应用程序接收到响应数据后&#xff0c;将其转换为应用程序可识别的数据格式。应用…

qt-C++笔记之QLabel加载图片

qt-C笔记之QLabel加载图片 —— 2024-04-06 夜 code review! 文章目录 qt-C笔记之QLabel加载图片0.文件结构1.方法一&#xff1a;把图片放在项目路径下&#xff0c;在 .pro 文件中使用 DISTFILES添加图片文件1.1.运行1.2.qt_test.pro1.3.main.cpp 2.方法二&#xff1a;不在 .pr…

院内感染的相关因素分析(Boruta联合SHAP分析2)R

院内感染的相关因素分析&#xff08;Boruta联合SHAP分析2&#xff09;R 和鲸社区一键运行代码 院内感染是指住院患者在医疗机构内发生的感染&#xff0c;是医院管理中常见且严重的问题。院内感染不仅会延长患者住院时间&#xff0c;增加医疗费用&#xff0c;还会严重威胁患者生…

vim美化配置(懒人版)

文章目录 配置vim&#xff08;懒人版&#xff09;1.搜索资源2.安装3.自定义缩进4.卸载方法 配置vim&#xff08;懒人版&#xff09; 1.搜索资源 打开gitee&#xff0c;注意到上面的搜索框 搜索 vimforcpp 进入&#xff0c;找到安装方法中的链接 2.安装 复制粘贴到linux中的命…

Windows IIS搭建FTP服务器、FTP用户隔离、Serv-U搭建FTP服务器

一、搭建FTP服务器 Server: 新建文件夹bbb&#xff0c;里面存放两个文件 Client: &#xff08;1&#xff09;通过资源管理器访问FTP &#xff08;2&#xff09;DOS命令访问FTP 下载bbb..txt 上传aaa.txt文件 查看上传情况 二、通过IIS服务中的FTP实现隔离用户 Server&#x…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

java小作业(5)--编写一个三角形类(第一遍)

1.题目&#xff1a; 2.代码&#xff1a; public class Xain{ //定义类名&#xff0c;要与文件.class名字一样private double yibian; //封装private double erbian;private double sanbian;public Xain(double yibian,double erbian,double sanbian){ //初始化…

分享three.js实现乐高小汽车

前言 Web脚本语言JavaScript入门容易&#xff0c;但是想要熟练掌握却需要几年的学习与实践&#xff0c;还要在弱类型开发语言中习惯于使用模块来构建你的代码&#xff0c;就像小时候玩的乐高积木一样。 应用程序的模块化理念&#xff0c;通过将实现隐藏在一个简单的接口后面&a…

Azkaban集群模式部署详细教程

序言 Azkaban是一个用于工作流程调度和任务调度的开源工具&#xff0c;它可以帮助用户轻松地管理和监控复杂的工作流程。Azkaban的架构设计旨在提供高度可扩展性和可靠性&#xff0c;同时保持易用性和灵活性。 Azkaban的架构可以分为三个主要组件:Executor、Web Server和db数据…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

Linux:五种IO模型的基本认识

文章目录 IO的本质五种IO模型异步和同步 阻塞IO非阻塞IO信号驱动IO IO的本质 在之前的内容中已经结束了对于网络和操作系统的学习&#xff0c;那么回过来再继续看IO&#xff0c;什么是IO呢&#xff1f; 对于网络的学习当中&#xff0c;实际上也是一种IO&#xff0c;数据从计算…

使用vite创建一个react18项目

一、vite是什么&#xff1f; vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于原生 ES 模块提供了丰富的内建功能&#xff0c;如速度快到惊人的模块热更新&#xff08;HMR&#xff09;。 …

博客部署004-centos安装mysql及redis

1、如何查看当前centos版本&#xff1f; cat /etc/os-release 2、安装mysql 我的是centos8版本&#xff0c;使用dnf命令 2.1 CentOS 7/8: sudo yum install -y mysql-community-server 或者在CentOS 8上&#xff0c;使用DNF:&#x1f31f; sudo dnf install -y mysql-ser…

探秘MIMO技术:无线通信革命的多天线奇迹

单根发射天线和单根接收天线之间的信道容量受限于香农公式&#xff0c;要想在相同的频谱带宽下进一步提高信道容量&#xff0c;要采用多天线技术。 1. 什么是MIMO MIMO&#xff1a;Multiple-Input Multiple-Output&#xff0c;即多入多出系统。这里的入和出是相对于发射天线和…

力控机器人原理及力控制实现

力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时&#xff0c;将力传感技术&#xff08;Force Sensing Technology&#xff09;和控制算法&#xff08;Control Algorithm&#xff09;结合起来&a…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

LabVIEW太赫兹波扫描成像系统

LabVIEW太赫兹波扫描成像系统 随着科技的不断发展&#xff0c;太赫兹波成像技术因其非电离性、高穿透性和高分辨率等特点&#xff0c;在生物医学、材料质量无损检测以及公共安全等领域得到了广泛的应用。然而&#xff0c;在实际操作中&#xff0c;封闭性较高的信号采集软件限制…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持&#xff1a; ◆ 主流大型数据库Oracle、SQLServer、MyS…

DC9 Debian和sql注入

信息收集 sudo arp-scan -l 列出局域网主机 arp-scan向局域网中所有可能的ip地址发出arp请求包&#xff0c;如果得到arp回应&#xff0c;就证明局域网中某台主机使用了该ip dc9的ip &#xff1a; 192.168.146.133 访问网页 cms为Debian 端口扫描 22端口是filtered 隐藏目…