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列表
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'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_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目录, 分别在目录下放置一张图片
Django_01/app01/static/python.jpg
Django_01/app01/my_files/mysql.jpg
Django_01/static/go.jpg
* 2. 启动项目
* 3. 在浏览器中输入: 127.0.0.1:8000/static/python.jpg 正常访问到图片资源.
* 4. 在浏览器中输入: 127.0.0.1:8000/my_files/mysql.jpg 404 找不到网页
* 5. 在浏览器中输入: 127.0.0.1:8000/static/go.jpg 404 找不到网页
2.3 资源集合
自定义静态文件夹的路径可以在settings.py配置文件中设置资源集合 STATICFILES_DIRS属性.
默认是不设置的, 需要手动添再配置该属性, 属性的以列表的形式表示, 可以写多个值, 值是一个个的路径.
STATICFILES_DIRS = [
...
...
]
2.4 资源集合测试
* 1. 修改配置文件settings.py, 开发项目目录下的static目录与项目应用下my_files目录的访问.
STATICFILES_DIRS = [
BASE_DIR / 'static',
BASE_DIR/ 'app01/my_files',
]
* 2. 在浏览器中输入: 127.0.0.1:8000/static/python.jpg 正常访问
* 3. 在浏览器中输入: 127.0.0.1:8000/static/mysql.jpg 正常访问
* 4. 在浏览器中输入: 127.0.0.1:8000/static/go.jpg 正常访问
浏览器访问图片的时候, 图片的路径皆为: 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.
* 2. 在配置文件中 settings.py 里设置配置属性MEDIA_URL和MEDIA_ROOT
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
配置属性后, 还需要将media文件夹注册到Django, 让Django知道如何找到媒体文件, 否则无法在浏览器上访问该文件.
* 3. 在项目名文佳夹的urls.py文件为媒体文件夹media添加相应的路由地址
from django.contrib import admin
from django.urls import path
from app01 import views
from django.views.static import serve
from django.conf import settings
from django.urls import re_path
urlpatterns = [
path('admin/', admin.site.urls),
path('hello_word/', views.hello_word),
re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
]
* 4. 再次启动Django_01项目, 并在浏览器上访问 127.0.0.1:8000/media/learn.jpg 访问媒体文件.
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.
根目录下的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',
'DIRS': [BASE_DIR / 'templates',
BASE_DIR / 'app01/templates'],
'APP_DIRS': True,
...
}]
配置之后, 在视图函数中返回模板页面, 只需要写上页面的名称即可, Django会根据配置信息, 查找模板并返回.
新建一个路由, 在路由返回视图函数, 在视图函数中返回模板页面.
在index视图函数中可以返回根目录templates下的模板文件, 也可以返回App项目templates下的模板文件.
查找顺序, 先从根目录templates下查找, 再去App项目templates下查找.
path('index/', views.index)
def index(request):
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.
创建的库默认是没有表的.
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
将文件复制到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
将内置的迁移文件生成数据表.
* 4. 在可视化工具中查看创建的表.
* 5. 使用mysqlclient连接MySQL数据库时, Django对mysqlclient版本有使用要求,
打开Django的源码查看mysqlclient的版本要求.
D:\Python\Python3.8\Lib\site-packages\django\db\backends\mysql\base.py
* 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 文件中设置数据库连接模块
import pymysql
pymysql.install_as_MySQLdb()
* 4. 此时连接的库之前使用过用表存在, 使用 Navicat Premium 数据库可视化工具将所有的表删除.
* 5. 在PyCharm的Terminal界面输入Django操作指令: python manage.py migrate
将内置的迁移文件生成数据表.
如果使用的MySQL是8.0以上的版本, 在Django连接MySQL数据库时会提示 dajngo.db.utils.OperationalError的错误信息.
MySQL 8.0 版本以上的密码加密方式采用CHA2. 解决报错信息的方法: 将加密方式改回以前的加密方式.
在Navicat Premium 数据库可视化工具中运行修改密码的SQL语句:
ALTER USER 'root'@'locahost' IDENTIFIED WITH mysql_native_password BY '新密码';
FLUSH PRIVILEGES;
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')},
}
}
* 4. 删除之前删除的表
* 5. 执行数据迁移命令生成表
* 6. 数据表被重新生成了
6.7 通过SSH隧道远程连接MySQL
在企业开发中, 数据库和Web系统很可能部署在不同的服务器, 当Web系统连接数据库的时候, 如果数据库所在的服务器
禁止了外网直连, 只允许通过SSH方式连接服务器, 再从以连接服务器的基础上连接数据库.
Navicat Premium中通过SSH连接服务器
* 1. 新建连接 --> MySQL --> 弹出新建连接页面 --> 选择SSH选项
在SSH连接界面输入服务器的连接信息
在连接的时候先点测试连接在, 在测试成功之后再点确定
**我没有远程的服务器就不连接了**
* 2. 然后切换到常规页面, 输入服务器中MySQL的连接信息
Django通过SSH方式连接数据库, Django中需要先下载sshtunnel模块, 该模块能通过SSH方式连接目标服务器, 生成
服务器的SSH连接对象, 然后在Django的配置文件settings.py的DATABASES中设置数据库连接.
ssh_host = 'xxxx.xxxx.xxxx.xxx'
ssh_port = 22
ssh_user = 'root'
ssh_passeord = '123'
mysql_host = 'localhost'
mysql_port = 3306
mysql_user = 'root'
mysql_password = '123'
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,
remote_bind_address=(mysql_host, mysql_port)
)
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的输入和输出.
中间件的作用就是处理用户的请求信息和返回响应内容.
请求到响应的过程:
* 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',
'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 防止恶意程序单击劫持
|