1.3 Django 主要功能模块
2025-02-17
1.3.1 Django中的ORM
ORM:对象映射关系
- ORM(Object Relational Mapping,对象映射关系):把对象与数据库中的表关联起来,对象的属性映射到表的各个字段,还把对表的操作对应到对象的操作,实现了对象到SQL,SQL到对象的过程转换
- Django的ORM:使用了多种常用的数据库,PostgreSQL,MySQL,Oracle等
- Django把表模型定义为Model,定义过程比较简单,只需要集成django.db.models中的Model类就可以了,Model类中的每一个属性都能映射到表的对应字段
- 针对数据库中提供的字段类型,Django ORM都有对应的*Filed表示
- CharField,TextField,DateField等
- 对于数据库表的增删改查,Django也提供了简单且优雅的API
例子
- 系统中存在一张User表,有name和password两个字符型的字段,如何利用Django的ORM实现User Model
class User(models.Model):
name = models.CharField(max_length=150)
password = models.CharField(max_length=128)- 检索系统中的所有User记录
User.objects.all()- 检索系统中name含有a的所有User记录
User.Objects.filter(name__contains='a')- 创建name是b,password是c的User记录
User.Objects.create(name='b',password='c')1.3.2 用户模块与权限系统
设计思想,思考
开发任何一个站点都需要有用户的概念,用户登录,注销过程,用户浏览页面,订阅消息等功能,都需要由用户系统实现
Django提供的用户模块,能够快速实现与用户相关的基本功能
有了用户的概念,还需要对用户做一些区分,那些是普通用户,那些是管理员用户,那些是超级管理员用户
Django提供了权限系统作为解决方案
用户模块
Django的用户模块定义在auth应用中,主要提供的功能
- 实现用户与用户组,维护用户与用户组的关系
- 权限系统的逻辑设计
- 对每个Model添加增删改的权限
- 用户与用户组的权限定义
- 用户鉴权与登录功能
- 登录,注销,权限验证等功能相关的函数和装饰方法
1.3.3 Admin后台管理系统
- 针对数据存储表构建后台管理系统
- Django 提供了 Admin Web后台管理系统进行解决
- 新建项目系统之后,几乎不用做任何配置,Django就设置害了后台管理的功能
- 原生的Admin可以利用Model Admin实现个性化定制,如:针对字段值过滤,搜索功能,排序功能,针对数据表字段的展示顺序规则定义功能,字段归类功能等
1.3.4 视图
MTV设计模式的V,在Django中的提现是一个Python函数或者类,接受Web请求并返回Web响应
- 视图返回的相应可以是HTML文档
- 可以是重定向
- 或者Excel
# 简单的视图函数
from django.http import HttpResponse
def hello_django(request):
return HttpResponse("<html><body>Hello Django </body></html>")
# 从django.http 模块引入HTTPResponse,是视图的相应类型
# 定义一个hello_django的函数,也是一个视图函数
# 视图返回文本相应内容,是一个HttpResponse类型的对象- Django规定视图函数至少需要一个参数,且第一个参数是django.http.HttpResponse类型的对象
- 携带了Web请求的所有信息,按照约定称为:request
- 函数的名字并不关心,通常的做法是:将函数名称对应到实现的具体功能上
1.3.5 模板系统
- 把HTML硬编码到Python代码不是一个好的方案,原因:
- HTML代码主要实现站点的展现形式,且展现形式往往是需要经常修改的。直接硬编码到代码中,对HTML的修改必须要修改Python代码,但是实际的业务逻辑没有改变,不利于维护
- 业务实现上的python代码和HTML代码并不存在交集,耦合在视图中,会增加系统的复杂度,且维护起来会更加困难
- 利用模板系统,可以将页面设计的HTML代码和用于逻辑处理的Python代码分离
- 例子
<html><body>{{value}}</body></html>def hello_django(request):
return render(request,'hello.html',{'value':'Hrllo Django'})- 上面利用模板系统实现数据与逻辑的分离,解耦了业务处理逻辑与数据展现形式
1.3.6 表单系统Form
表单系统一般比较复杂,不同的表单的处理过程又是相似的
表单的完整过程
- 不同类型的数据项在表单中渲染成功HTML向用户展示
- 用户在表单中编辑并提交数据到后端服务器
- 服务逻辑对数据进行验证,以及后续的处理或者提示用户输入数据有误等等
Django表单系统的核心Form类,提供4个主要功能
- 自动生成HTML表单元素
- 检查表单数据的合法性
- 对不合法的表单数据进行回显,提示错误
- 将表单数据转换为对应的Python数据类型
例子:实现需要用户输入用户名和密码并提交验证
from django import forms
class LoginForm(forms.Form):
name = forms.CharField()
password = forms.CharField()然后创建模板文件 login.html,对应
<form action="/login/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="submit">
</form>最后,创建试图完成登录处理逻辑
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
# process user login
return HttpResponse("login success")
else:
form = LoginForm()
return render(request,'login.html',{'form':form})1.3.7 信号机制
Django 对信号机制的解释:在框架的不同位置传递特定的消息给应用程序执行特定的操作
- 是一种观察者模式(发布-订阅模式)
- 当系统中有event(事件)发生,一组senders(发送者)将signals(信号)发送给一组receivers(接收者),receivers再去执行预定的操作
- Django预定的信号
- 关于Model的执行动作信号
- 关于Http请求的执行动作信号
- 例子:Http请求到来的时候触发信号
实现消息接受这receiver,打印Request Coming
def receiver(sender, **kwargs): print("Request Coming")将信号绑定到receiver上面(也可以使用装饰器实现绑定)
from django.core.signals import request_started request_started.connect(receiver)最后,等待Http请求到来,触发receiver的执行。Django信号机制的执行是同步的,所以,耗时的任务不可使用信号机制
1.3.8 路由系统
MTV的设计模式中
- 用户向web站点发送请求(对应到一个URL)
- 先到达“对应的”视图,试图如何对应,需要路由
- Django利用URLconf构建起URL模式与试图函数之间的映射关系
- Django路由系统配置的核心是:path
- 基本格式
from django.urls import path
urlpatterns = [
path(route, view, kwargs=None, name=None)
]- path的四个参数
- route:标识URL的正则表达式;必填
- view:标识试图函数;必填
- kwargs:标识以字典的形式传递给视图的默认参数;可选
- name:给route起一个名字,用于反向解析;可选
- 路由匹配模式,可以把Django的URL映射类型分为3类
- 固定URL映射:
path('bbs/',views.bbs) - 动态URL映射:
path('bbs/<int:page>',views.bbs_list) - 两级(多级)URL映射:
path('topic/',include('topic.urls')): 将所有的topic的请求都嫁给topic这个App下面的urls去处理
- 固定URL映射:
1.3.9 中间件
中间件是一个插件系统,嵌入到Django的Request和Response之间执行,可以对输入和输出的内容进行修改。
中间件是用来定义处理所有请求和相应的通用处理框架
中间件就是一个普通的Python类对象,定义了一些函数在试图执行的前后调用,这些函数称为钩子函数,且名称固定
- process_request:在请求到来的时候调用
- process_view:在对应的视图函数执行之前调用
- process_exception:在视图函数抛出异常的时候调用
- process_template_response:在视图函数有相应,且响应对象包含render方法时调用
- process_response:在返回响应之前调用
除了单个中间件执行的生命周期,Django也规定了中间件的执行顺序与配置的关系
配置越靠前的中间件越先被执行,从上到下顺序地执行每一个中间件,返回的时候正好相反,按照各个中间件配置的顺序逆序执行

- 中间件将特定的业务处理逻辑和通用服务解耦
- 作为一个可插拔的组件对外提供服务
1.3.10 缓存系统
访问web站点的某一个服务会发现执行比较慢,这种情况发生的原因可能情况
- 后端的复杂计算靠逻辑
- 访问数据库系统或者文件系统造成的I/O延迟
提高web站点执行效率的方法:使用缓存
将经常被用户访问的页面结构保存下来,再次访问是只需要返回缓存的结果即可
Django能够无实现不同级别的缓存粒度
- 缓存单个视图的结果输出
- 缓存难以生成的片段
- 缓存整个网站
Django支持多种缓存类型
- Memcached
- 数据库
- 文件系统等
- 或者根据需要开启一种或者多种缓存类型
例子:缓存一个视图的结果
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def hello_django(request):
pass- 上面的代码,只比原来的视图函数多了一个cache_page装饰器,就可以将视图的结果缓存15分钟(装饰器的参数是秒)