PythonDjango开发实战 课件.pptx

上传人:牧羊曲112 文档编号:1869358 上传时间:2022-12-22 格式:PPTX 页数:102 大小:3.33MB
返回 下载 相关 举报
PythonDjango开发实战 课件.pptx_第1页
第1页 / 共102页
PythonDjango开发实战 课件.pptx_第2页
第2页 / 共102页
PythonDjango开发实战 课件.pptx_第3页
第3页 / 共102页
PythonDjango开发实战 课件.pptx_第4页
第4页 / 共102页
PythonDjango开发实战 课件.pptx_第5页
第5页 / 共102页
点击查看更多>>
资源描述

《PythonDjango开发实战 课件.pptx》由会员分享,可在线阅读,更多相关《PythonDjango开发实战 课件.pptx(102页珍藏版)》请在三一办公上搜索。

1、Python Django 开发实战,第1章 初识 Django 框架,Django 的 MTV 设计模式,Django 提供的主要功能模块,Django 的产生背景,Django 的产生背景,开发 Web 站点,通常需要做这样的几件事:构建用户账户体系,实现 Web 站点的登录与注册功能数据表模型定义及访问功能实现编写业务逻辑实现站点功能后台管理功能路由模型实现功能请求映射,几乎所有的 Web 站点都需要做这样的事,且很多功能设计都是类似或一样的,所以,这里会引入大量的重复工作。,这里存在的问题,由此产生了 Web 框架的概念(思想),这也就是 Django 产生的根本原因!,Django

2、的产生背景,Django 的版本发布过程,说明:Django 最后一个支持 Python2.7 的版本是 1.11LTS,而最新的 Django 功能版本是 2.0,如果想使用最新版本的话,需要选择 Python3。,Django 的 MTV 设计模式,MVC 设计模式的交互过程,对于 MVC 设计模式: M 即 Model,代表的是数据存取层,是对数据实体的定义和对数据的 CRUD 操作; V 即 View,代表的是视图层,即系统中选择显示什么和怎么显示的部分; C 即 Controller,代表的是 控制层,它负责根据从 View 中输入的指令,检索 Model 中的数据,再以一定的逻辑产

3、生最 终的结果输出。,Django 的 MTV 设计模式,MTV 设计模式的交互过程,对于 MTV 设计模式: M 即 Model,数据存取层,这一层里处理所有与数据相关的事务,提供在数据库中管理 (添加、修改、删除)和查询记录的机制; T 即 Template,表现层,处理页面的显示,即所有与表现相关的决定都由这一层去处理; V 即 View,业务逻辑层,负责处理业务逻辑,会在适当的时候将 Model 与 Template 组 合在一起,通常被认为是联通 M 与 T 的桥梁。,Django 提供的主要功能模块,Django 中的 ORM,ORM 全称是 Object Relational M

4、apping(对象关系映射),它把对象与数据库中的表关 联起来,对象的属性映射到表的各个字段,同时,它把对表的操作对应到对对象的操作,实 现了对象到 SQL,SQL 到对象的过程转换。,用户模块与权限系统,提供了用户、用户组、权限等概念;维护了用户、用户组和权限之间的关联关系;包含了用户鉴权与登录等基本功能。,Admin 后台管理系统,对系统中定义的数据表(Model)提供了原生的后台管理支持,且支持对管理页面的个性化定制,例如,针对字段值的过滤功能、搜索功能、排 序功能,数据表字段的展示顺序规则定义功能,字段归类功能等等。,Django 提供的主要功能模块,视图,Django 视图是 MTV

5、 设计模式中的 V,它在 Django 中的体现是一个 Python 函数或者是 类,接收 Web 请求并返回 Web 响应。,模板系统,模板系统用于将页面设计的 HTML 代码和用于逻辑处理的 Python 代码分离开来,即做到了数据与逻辑的分离,去除不同代码之间的耦合。,优雅的表单系统 Form,表单系统可以根据 Form 对象的定义:自动生成 HTML 表单元素、检查表单数据的合法性、对不合法的表单数据进行回显,并提示错误、将表单数据转换为对应的 Python 数据类型。,Django 提供的主要功能模块,信号机制,Django 对信号机制的解释是:在框架的不同位置传递特定的消息给应用程

6、序执行预定的操作。它是一种观察者模式,或者叫做发布-订阅模式。即当系统中有 event(事件)发生, 一组 senders(发送者)将 signals(信号)发送给一组 receivers(接收者),receivers 再去执行预定的操作。,路由系统,从 MTV 的设计模式中可以看到,用户向 Web 站点发送请求(对应到一个 url),首先会 到达“对应的”视图,那么,这里的视图是怎么对应上的呢?这就是 Django 路由系统的作用。Django 利用 URLconf 构建起 URL 模式与视图函数之间的映射关系,即利用 Django 的 特定配置方式,设定好哪个 url 可以去执行哪一段 P

7、ython 代码。,中间件,中间件是一个插件系统,嵌入在 Django 的 Request 和 Response 之间执行,可以对输入 和输出内容作出修改。中间件是业务无关的技术类组件,是用来定义处理所有请求和响应的通用处理架构。,Django 提供的主要功能模块,缓存系统,有时访问 Web 站点的某一个服务会发现执行的比较慢,这种情况发生的原因可能是背后有复杂的计算逻辑,也可能是访问数据库系统或者文件系统造成的 IO 延迟等等。通常提 高 Web 站点执行效率的方法是使用缓存,将经常被用户访问到的页面结果保存下来,再次 访问时只需要返回缓存的结果,不会再次执行计算等类似耗时的操作。 Djan

8、go 提供一个健壮的缓存系统,实现了不同级别的缓存粒度:可以缓存单个视图的结果输出,缓存难以生成的片段,或者是缓存整个网站。,第2章 Django 开发环境配置,虚拟环境的安装与配置,Django 的安装与配置,Python 安装与配置,MySQL 的安装与配置,PyCharm 的安装与配置,Python 的安装与配置,Python:Linux 和 Mac OS X 默认会附带 Python 2.7,需要安装 Python 3.7(Django 2.0 需要的 Python 版本 = 3.4),ip:Python 3.4 及以上版本内置(更新:python3 -m pip install -U

9、 pip ),常用的基本命令如下表所示,ip 常用的基本命令,虚拟环境的安装与配置,Virtualenv:让每个应用/工程都有自己的运行时环境,需要注意的地方,安装 Virtualenv:pip install virtualenv,给 BBS 应用创建虚拟环境(注意命名):virtualenv -p /usr/local/bin/python3.7 bbs_python37,进入虚拟环境:source ./bin/activate,退出虚拟环境:deactivate,Django 的安装与配置,Django 是 Python 包,使用 pip 工具在虚拟环境中安装,pip install d

10、jango=2.0.7,说明:这里指定了需要安装的 Django 的版本,如果不指定,pip 命令会选择安装最新的版本。,验证在虚拟环境中安装了 Django,且版本是指定的,以上输出显示,当前的 Python 虚拟环境成功安装了 django 模块,且版本号是 2.0.7,符合预期。,MySQL 的安装与配置,需要去 MySQL 的官方网站下载适合操作系统的安装文件。官网上面提供了两种 安装文件,一种是可以直接运行的安装包,另一种是需要再去配置的压缩包。本质上来说,这两种文件是一样的,最好选择第一种安装文件,即应用程序安装包。,开始安装,安装完成,MySQL 的安装与配置,MySQL 安装完

11、成之后,默认是不会加入到环境变量中去的,这里,手动把 MySQL 的 可执行文件加入到环境变量中去。,PyCharm 的安装与配置,PyCharm 是一种 Python IDE,它是一个跨平台的开发环境,官方提供 Windows、macOS 和 Linux 版本。目前,PyCharm 被社区认为是最好用的 Python IDE。,从官方网站中下载对应于操作系统的版本,由于也是一个应用程序,直接点击安装即可。,安装完成,设置面板,第3章 Django 项目框架搭建,修改项目的默认配置,初始化项目环境,Django 管理工具创建项目骨架,Django 管理工具创建项目骨架,django-admin

12、:Django 提供的命令行管理工具,startproject,用于创建 Django 项目的子命令,在虚拟环境中执行命令:django-admin startproject my_bbs,manage.py,用于管理 Django 项目的命令行工具,完成了项目骨架的创建之后,进入到 my_bbs 容器目录中就可以启动内置的服务器运行当前的项目,执行命令:python manage.py runserver,startproject 是 django-admin 的子命令,用于创建项目。这里,使用这个子命令创建了 my_bbs 项目。正常情况下,执行这个命令不会打印任何内容,但是它会在当前目录

13、下生成 一个项目的骨架,也可以称作是项目的容器。,除了使用 runserver 启动项目之外,还可以使用 shell 命令进入到当前项目的环境中去:python manage.py shell,Django 管理工具创建项目骨架,settings.py :Django 项目的配置文件,BASE_DIR定义的是项目所在的完整路径,SECRET_KEY加密盐,用于对加密数据做 Hash 处理,DEBUG调试标记,在开发环境中设置为 true,ALLOWED_HOSTS用于配置可以访问当前站点的域名,INSTALLED_APPS当前项目需要加载的 app 包路径列表,MIDDLEWARE需要加载的中

14、间件列表配置,ROOT_URLCONF量标记的是当前项目的根 url 配置,TEMPLATES列表变量,用于项目的模板配置,WSGI_APPLICATIONWSGI 应用程序对象的完整 Python 路径,修改项目的默认配置,配置语言环境和时区,把 BBS 项目修改为中文简体:LANGUAGE_CODE = zh-Hans,对时区不敏感: TIME_ZONE = Asia/Shanghai、USE_TZ = False,配置开发数据库,配置 MySQL:Engine(数据库引擎)、NAME(数据库名称)、USER(数据库用户名)、PASSWORD(数据库名称)、HOST(数据库服务器地址)、P

15、ORT(数据库服务器端口号),是由于 MySQLdb 不支持 Python3,所以 Django 连接 MySQL 就不能再使用 MySQLdb 了,需要安装 mysqlclient。在虚拟环境中执行命令:pip install mysqlclient,Django 自带的 sqlite3 不适合做应用项目的数据库,所以,这里用 MySQL 替代项目的默认数据库,需要修改 DATABASES 配置。,初始化项目环境,INSTALLED_APPS 中定义应用的数据库迁移,makemigrations:manage.py 的子命令,生成应用迁移文件,migrate:manage.py 的子命令,用

16、于将应用的模型定义或修改同步到数据库中,django_migrations:记录每一次数据库迁移动作,创建超级用户登录管理后台,createsuperuser:manage.py 的子命令,用于创建超级用户,初始化项目环境,给 BBS 项目创建应用,startapp:manage.py 的子命令,用于创建应用,Python 项目中的 requirements.txt 文件,ip freeze:得到依赖清单,ip install:重建项目环境,将项目装载到 IDE 中,第4章 Django ORM 应用与原理剖析,Model 相关的概念与使用方法,Model 的查询操作 API,构建 post

17、应用需要的数据表,ORM 实现原理分析,构建 post 应用需要的数据表,ost 应用的 Models 定义,BaseModel:抽象 Model 基类,定义通用参数和通用属性,直接继承自 django.db.models.Model,Topic:话题 Model,继承自 BaseModel,从而实现间接继承,Comment:话题评论 Model,继承自 BaseModel,从而实现间接继承,ost 应用承载这样的几个功能:用户可以在 BBS 站内发表话题,称作 Topic可以针对每一个 Topic 发表评论,称作 Comment可以对每一个 Comment 支持或者反对,Topic 和 Co

18、mment 都实现了 _str_ 方法,且函数的返回值也很类似,都打 印了 id 和标识内容的字段,id 字段是在 Model 定义中没有主动指定主键的情况下,Django 自动加上去的。,构建 post 应用需要的数据表,ost 应用完成数据库迁移,INSTALLED_APPS:将 post 应用加载到 BBS 项目中,将 post.apps.PostConfig 放在列表中的第一个,执行数据库迁移: python manage.py makemigrations post:在 post/migrations 包下面生成迁移文件 python manage.py sqlmigrate pos

19、t 0001:打印迁移文件执 行的 SQL 语句 python manage.py check:检查迁移 SQL 语句中的问题 python manage.py migrate:将 Models 映射为数据库的表,数据表名称:由于在 Topic 和 Comment 中都没有显示的指定表名,所以,应用 Django 的规则,将表名定义为,应用名_小写类名,即 post_topic 和 post_comment,编写完成了 post 应用的 Models 定义,为了实现对这些 Models 对象的操作,需要使用 manage.py 提供的数据库迁移工具将 Models 对象映射为数据库中的表。,M

20、odel 相关的概念与使用方法,Model 的组成部分,django.db.models.Model,Meta 元数据,数据表项 Field,Meta 元数据类属性,abstract,db_table,indexes,unique_together,Field 通用字段选项,blank,unique,null,db_index,db_column,default,primary_key,choices,help_text,基础字段类型,django.db.models.Field,IntegerField,AutoField,CharField,TextField,BooleanField,D

21、ateField,DateTimeField,EmailField,SignField,Model 相关的概念与使用方法,三种关系字段类型,ForeignKey,OneToOneField,ManyToManyField,Model 的继承模型,抽象基类,多表继承,代理模型,Model 的查询操作 API,创建 Model 实例对象,返回单实例的查询方法,使用 save 方法创建 Model 实例,使用 create 方法创建 Model 实例,使用 get 查询,使用 get_or_create 查询,Model 的查询操作 API,返回 RawQuerySet 的查询方法,返回 Query

22、Set 的查询方法, Topic.objects.all() :使用 all 方法获取所有的数据记录 Topic.objects.reverse() :使用 reverse 方法获取逆序数据记录 Topic.objects.order_by(-title, created_time) :使用 order_by 方法自定义排序规则 Comment.objects.filter(up_gte=30):使用 filter 方法过滤数据记录 Comment.objects.exclude(up_lt=29):使用 exclude 方法反向过滤 Comment.objects.values(id, up

23、):使用 values 方法获取字典结果 Comment.objects.values_list(id, up):使用 values_list 方法获取元组结果 Comment.objects.all():2:对 QuerySet 进行切片, Topic.objects.raw(SELECT id FROM post_topic WHERE title = %s, first topic) Comment.objects.raw(SELECT * FROM post_comment)0:RawQuerySet 支持索引和切片,Model 的查询操作 API,返回其他类型的查询方法,存在关联关系

24、的查询, Comment.objects.filter(id_gt=1).count():返回 QuerySet 的对象数量 Comment.objects.filter(id_gt=1).exists():判断 QuerySet 是否包含对象 Comment.objects.filter(id=1).update(up=90, down=33):使用 update 方法更新 Model 实例 Topic.objects.filter(id_lte=2).delete():使用 delete 方法删除 Model 实例, ment_set.filter(content=very good!):

25、Model 的反向查询 Comment.objects.filter(topic_title_contains=first):跨关联关系查询,Model 的查询操作 API,F 和 Q 查询,聚合和分组查询, Comment.objects.filter(up_lte=F(down):要查询 up 小于等于 down 的 Comment Comment.objects.filter(up_gt=F(down) * 2):查询所有 up 值大于 down 值 2 倍的 Comment 对象 Topic.objects.filter(Q(title_contains=topic):查询 title

26、 中包含 topic 的所 有 Topic 对象, Comment.objects.filter(topic=1).aggregate(Sum(up):首先得到 id 为 1 的 Topic 的 Comment 对象,之后,计算 up 值的加和 Comment.objects.values(topic_id).annotate(Sum(up).order_by():得到每一个 Topic 的所有 Comment 的 up 加和,ORM 实现原理分析,Python 元类,类是用来生成对象的、类也是对象、元类是用来创建类的,type 中定义了创建类的三要素:类名、父类、属性字典,Python 描述

27、符,描述符协议: _get_、_set_、_delete_,为什么要继承自 models.Model,自动添加的自增主键,自动添加的查询管理器,Manager 是怎么实现的,ORM 实现原理分析,一次完整的 ORM 实现过程,Topic.objects.filter(id_lte=2),开始,安装 Manager,Model 与 Manager 进行挂钩,Manager 调用 QuerySet 的 filter 方法,QuerySet 将返回结果进行 to python 的格式转换,由 Query 完成,To Python Object,结束,QuerySet.filter,第5章 Djang

28、o 管理后台,使用管理后台操作 Model 对象实例,使用 ModelAdmin 自定义管理后台,将 Model 注册到管理后台,管理后台实现原理分析,将 Model 注册到管理后台,启用管理后台的准备工作,settings.py 文件中的配置:Admin 同样是 Django 的一个应用,除了要在 INSTALLED_APPS 中加载自身之外,还有依赖应用、中间件,应用数据库迁移:既然是应用,就可能定义了 Model。Admin 应用在数据库迁移过程中只创建了一张 表:django_admin_log,用于记录通过在管理后台中完成的对 Model 的添加、更改和删除操作。,django_ad

29、min_log 表结构,将 Model 注册到管理后台,admin.py: manage 的 startapp 命令在创建 post 应用的时候会自动的创建 admin.py 文件,想要把自 定义的 Model 注册到管理后台,就需要在这个文件中进行声明,实现 Model 的注册,需要注册的 Model:Topic、Comment(post 应用中定义的),Model 在管理后台中显示的名称:可以通过 Meta 元数据指定,from django.contrib import admin from post.models import Topic, Comment admin.site.reg

30、ister(Topic, Comment),自定义 Model 显示的名称,使用管理后台操作 Model 对象实例,管理后台中的基本操作,ChangeList:管理后台中列出的 Model 对象实例的页面,Topic 的 ChangeList 页面,动作工具栏:常被用于对实例对象的批处理操作,目前只有一个动作可以使用: “删除所选的话题”,勾选实例,点击执行,可以将其从数据表中删除。Model 实例对象列表:这里会展示 Topic 对应数据表的数据记录,数据记录的 名称取自 _str_ 函数的返回值。Model 实例对象总数:位于实例列表的下方(如图中显示的“3 话题”),Django 会使用

31、 SELECT COUNT(*) 的方式获取记录总数。增加 Model 实例对象:位于页面的右上角,点击按钮即可跳转到 Model 的添加 页面。,使用管理后台操作 Model 对象实例,管理后台中的基本操作,ChangeForm:可以实现编辑 Model 对象的页面,Topic 的 ChangeForm 页面,对于 ChangeForm 页面,需要知道它的一些重要特性:字段展示的顺序与在 Model 中定义的顺序相同,但是需要注意,主键和不可编辑的字段不会显示。字段展示的控件由字段类型决定,例如字符类型的 title 用文本框展示、布尔类 型的 is_online 用复选框展示等等。字段下方

32、的文字提示由字段定义的 help_text 参数指定,例如 title 字段显示的 “话题标题”。对字段的修改内容如果不合法,页面会给出错误提示。页面最下方的按钮实现字面意思的功能,对于删除操作需要注意,级联删除的特性可能会导致其他 Model 对象实例被删除。右上角的历史按钮可以查看从当前管理页面操作当前实例对象的记录。,使用管理后台操作 Model 对象实例,django_admin_log:记录管理后台操作历史的 log 表,管理后台操作历史,管理后台展示变更历史:在ChangeForm 页面,点击页面右上角的“历史” 按钮进入到变更历史页,Model 实例对象变更历史,django_a

33、dmin_log 表中记录的实例变更历史,使用 ModelAdmin 自定义管理后台,注册 Model 到 Admin 的两种方式,ModelAdmin 的常用属性,register 方法,register 装饰器,利用 actions 丰富动作工具栏,利用 list_display 修改 ChangeList 的显示列,利用 search_fields 给 ChangeList 添加搜索框,利用 list_filter 给 ChangeList 添加过滤器,利用 ordering 重新定义 Model 实例的顺序,分页相关的属性,利用 get_queryset 限制返回的数据记录,利用 fi

34、elds 自定义显示 Model 的字段,利用 fieldsets 将 ChangeForm 中的字段分组显示,利用 readonly_fields 将部分字段设置为只读,利用 raw_id_fields 降低数据库检索开销,利用 save_model 定制实例对象的保存操作,管理后台实现原理分析,Python 装饰器,contenttypes 应用分析,简单装饰器,带参数的装饰器,ContentType 可以动态的访问 Model 对象,Django 内置应用,记录项目中所有 app 和 model 的对应关系,并记录于 ContentType 中,model_class 方法用于获取当前

35、ContentType 实例所对应的 Model 对 象,get_object_for_this_type通过传递关键字参数可以获取到 Model 实例对象,get_all_objects_for_this_type根据提供的关键字参数返回 QuerySet,get_for_id通过 id 获取 ContentType 实例对象,get_for_model根据传递的Model或Model实例获取对应的ContentType实例对象,装饰器本质上是一个函数或类,它的返回值也是一个函数或类。,第6章 视图,视图的高级特性和快捷方法,基于类的通用视图,视图初探,视图工作原理分析,视图初探,定义第一个

36、视图,views.py:创建 post 应用时,由 Django 自动创建,同时 Django 也建议视图定义在这个文件中,一个最简单的视图:,每一个视图都会接收一个请求,对请求进行自定义处理,最后返回一个响应,这就已经包含了一个视图的完整定义了。,from django.http import HttpResponsedef hello_django_bbs(request): html = Hello Django BBS return HttpResponse(html),这段代码非常简单,只有四句话,但是已经包含了一个视图的完整功能了。解释如下:引入 HttpResponse,作为视图

37、的返回类型视图函数声明,当前的函数名是 hello_django_bbs,它仅仅描述自身的用途函数内部定义业务处理逻辑,这里简单的定义了视图的响应内容视图最后返回一个 HttpResponse 对象,标识一次 Web 请求的结束,视图初探,视图的请求与响应对象,HttpRequest:每当请求到来的时候,Django 就 会创建一个携带有请求元数据的 HttpRequest 对象,传递给视图函数的第一个参数。HttpRequest 定义了很多属性和方法:,HttpResponse:在视图中创建并作为返回对象(主动返回), HttpResponse 同样定义了很多属性和方法:,method标识请

38、求所使用的 HTTP 方法,scheme标识请求的协议类型:http(s),ath当前请求页面的路径,GET包含 GET 请求中的所有参数,POSTPOST 请求中提交的表单数据,status_code标识一次请求的状态,content存储响应内容的二进制字符串,write 方法这个方法将 HttpResponse 视为类文件对象,可以向其中添加响应数据,视图初探,基于类的视图,视图可以是函数,也可以是类,类视图同样能够实现视图的功能。类视图最大的特点是可以利用不同的实例方法响应不同的 HTTP 请求方法(GET、POST),且可以利用面向对象的技术将代码分解为可重用的组件。,一个简单的类视图

39、定义,FirstView 继承自 View,它是所有基于类的视图的基类。其中定义了 get 和 post 方法,映射到 GET 和 POST 请求类型。FirstView 重写了父类的 dispatch 方法,dispatch 根据 HTTP 类型实现请求分发, 例如,如果是 GET 请求,则分发给 get 方法。如果 View 中没有实现对应请求类型的方法,则会返回 HttpResponseNotAllowed。,视图初探,动态路由,转换器三要素:regex:字符串类型的类属性,根据属性名可以猜测,这是一个正则表达式,用于匹配 URL 对应位置的参数值to_python:参数 value 是

40、从 URL 中匹配到的参数值,通过强转成对应的类型传递给视图函数to_url:将一个 Python 类型的对象转换为字符串,to_python 的反向操作,默认参数:视图也是普通的 Python 函数,参数当然也就可以有默认值,re_path:使用 re_path 的理由是 path 方法和转换器都不能满足需求,动态路由即 URL 不是固定的,URL 中包含了传递给视图的参数变量。,视图初探,给 post 应用添加视图,Topic 列表视图,Topic 实例对象信息视图,给 Topic 实例对象添加评论的视图,视图中的代码应该尽量简洁,复杂的业务逻辑不应该出现在视图中,所以,通常会把逻辑或者

41、service 部分单独放到一个文件中,例如:post_service.py。,视图的高级特性和快捷方法,URL 的反向解析,视图重定向,reverse 方法:通过 URL 模式的名字或可调用的视图对象,得到视图 URL,命名空间:应用命名空间、实例命名空间,redirect 方法:实现 302(临时)或 301(永久)重定向,常用的快捷方法,render 方法:将给定的模板和上下文字典组合,渲染返回 HttpResponse 对象,render_to_response 方法:类似于 render,get_object_or_404、 get_list_or_404:获取响应或者返回 404,

42、基于类的通用视图,TemplateView,随着应用越来越多,重复性的业务逻辑也会越来越多,逐渐的会使开发过程变得枯燥乏味。Django 意识到了这个问题,它将常用的功能抽象出来,给开发者提供了基于类的通用视图。,TemplateView 用于渲染模板,Django 中基于类的视图都应该继承自 View,TemplateView 也不例外,当视图中没有复 杂的业务逻辑,例如系统的引导页面、欢迎页面,使用 TemplateView 是非常简单方便的。其定义如下(位于 django/views/generic/base.py 文件中):,class TemplateView(TemplateRes

43、ponseMixin, ContextMixin, View),除了基本的 View 之外,TemplateView 还继承了两个 Mixin:ContextMixin:这个类中定义了一个方法:get_context_data,它返回一个字典对象,用于渲染模板上下文。通常,在使用 TemplateView 时都会重写这个方法,给模板提供上下文数据。TemplateResponseMixin:这个类中定义了两个重要的属性:template_name 和 render_to_response 方法。其中,template_name 用于指定模板路径,它是必须要提供的;render_to_respo

44、nse 方法根据模板路径和上下文数据(context)返回 TemplateResponse。,基于类的通用视图,RedirectView,页面重定向在 Web 开发中也是很常见的行为,所以,Django 为重定向功能的实现提供了通用类视图 RedirectView。它定义于 django/views/generic/base.py 文件中,看一看它的定义:,RedirectView 的定义,RedirectView 中定义了四个类属性和两个方法:permanent:标识是否使用永久重定向,默认是 False,所以,默认情况下实现的是临时重定向,即 302 响应url:重定向的地址patter

45、n_name:重定向目标 URL 模式的名称(即 path 中的 name 参数)query_string:是否将查询字符串拼接到新地址中,默认为 False,将丢弃原地址中的查询字符串,视图工作原理分析,解决一键多值问题的 QueryDict,MultiValueDict:dict 的子类,用来处理多个值对应相同的键的场景,QueryDict:继承自 MultiValueDict,类视图基类 View,http_method_not_allowed 方法:返回 405,标识当前的请求类型不被支持,dispatch 方法:根据 HTTP 请求类型调用 View 的同名函数,实现请求分发,as_

46、view:创建 View 类实例,调用 dispatch 方法根据请求类型分发处理函数,第7章 Django 模板系统,模板系统语法,模板系统工作原理分析,模板系统基础,模板系统基础,模板系统初使用,Template 对象:使用字符串填充模板代码,可能会抛出 TemplateSyntaxError 异常,模板后端的默认配置,Context 对象:传递字典对象用于模板的渲染(变量替换),TEMPLATES:位于 settings.py 文件中,列表类型,每一个元素都是一个字典对象,每个字典对象代表了配置的模板后端。字典中的 key 代表的含义如下:,BACKEND:指定了要使用的模板引擎类带点的

47、 Python 路径,Django 默认使用的是 django.template.backends.django.DjangoTemplatesDIRS:一个目录列表,指定模板文件的存放路径。模板引擎将按照列表中定义的顺序查找模板文件APP_DIRS:一个布尔值,如果为 True 时,模板引擎会在已安装应用的 templates 子目录中查找模板OPTIONS:指定额外的选项,不同的模板引擎有着不同的可选额外参数,模板系统语法,模板变量与替换规则,模板标签,判断执行逻辑的 if 标签:与 endif 成对出现,与 Python 中的 if、elif 类似,字典查询:a.b 查询 ab,属性查询

48、:a.b 查询 a.b,方法调用:a.b 查询 a.b(),迭代序列元素的 for 标签:对列表或元组进行迭代,与 Python 中的 for 语法类似,获取视图访问地址的 url 标签:与 reverse 函数类似,避免在模板中对访问地址进行硬编码,数字索引查询:a.1 查询 a1,用于多行注释的 comment 标签,模板系统语法,过滤器,获取变量长度的 length 过滤器,转换字符大小写的过滤器:lower、upper,获取首个或末尾元素的过滤器:first、last,truncatewords 过滤器截取指定个数的词,过滤器用于在显示变量之前对变量的值进行调整,它们在模板中非常常见,

49、使用管道符 号(“|”)指定。有些过滤器可以接受参数,如果参数中带有空格,需要用引号括起来。过滤器的特色是可以通过组合多个过滤器实现链式调用。,模板系统语法,模板继承,一些高级语言都会有继承的功能,将通用的功能或属性写在父类(或基类)里面,子类继承自父类,自动拥有父类的所有属性和方法。同时,还可以通过重写父类中的属性和方法实现定制。这样的继承特性,通过抽象共性,减少了大量的重复代码。 Django 模板系统同样支持继承,这是一个非常有用的功能,在实际的项目开发中模板继承也是非常常见的。,一个简单的父模板文件,这个父模板文件中使用了 % block % 标签,也就是可以被子模板覆盖的 block

50、。另外:block 标签成对出现,需要 % endblock % 标记结束需要给 block 标签起个名字,子模板中具有同样名称的 block 块完成对父模板的替换子模板可以不需要定义父模板中的所有 block,此时,子模板将原样使用父模板中的内容子模板需要使用 % extends % 标签继承父模板,且必须是模板中的第一个标签,通常继承声明会放在文件的第一行,模板系统工作原理分析,模板文件实现加载的过程,_engine_list方法获取模板后端:根据配置获取模板后端实例,DjangoTemplates 加载模板文件:get_template 方法,模板渲染机制实现分析,render 方法:实

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号