收藏 分销(赏)

PythonWeb开发基础教程 第5章 视图.pdf

上传人:曲**** 文档编号:225115 上传时间:2023-03-08 格式:PDF 页数:40 大小:913.31KB
下载 相关 举报
PythonWeb开发基础教程 第5章 视图.pdf_第1页
第1页 / 共40页
PythonWeb开发基础教程 第5章 视图.pdf_第2页
第2页 / 共40页
PythonWeb开发基础教程 第5章 视图.pdf_第3页
第3页 / 共40页
PythonWeb开发基础教程 第5章 视图.pdf_第4页
第4页 / 共40页
PythonWeb开发基础教程 第5章 视图.pdf_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、Python Web开发基础教程(Dj angol)第5章视图|3疆 霰赞洪胆黑巧用中度再累蜘衾:e 内容,不看Web页面最决童旭时建用泵产生成城应 一其他文档中显示响应好果。本章主要内容:定义视图,处理请求和响应,在视图中使用模型,基于类的视图5.1 定义视图 Dj ango电视图也可根为视督函数处用Python回数来定义视图。初图函接受Web备录,词数迟忸后谕息响应也容。里应灯内容可以是网页的HTML代码、XML文档、图像或者其他 瑙式而内容。视图函数代码文件称为视图文件,文件名按惯例使用views.py,当然也可以使用其他的文件名。视图文件放在项目的同名子文件夹或项目的应用文件夹中。本节

2、主要内容 定义和使用视图 返回错误 处理Http404异常5.1.1定义和使用视定义视图指在视图文件中实现完成业务逻辑处理的函数。,例虬下额代码中的showData函数在Web页面中显示当前日期 和从URL欧径中获取的数据。#chapter5chapter5views.py from dj ango.http import HttpResponse from datetime import date def showData(request,urlData):d=date.today()s=URL路径中的数据:%s当前日期:%s%(urlData,d)return HttpResponse(s

3、)完成视图函数定义后,在URL配置文件中配置URL来访问 该面卷示例代码如下。#chapter5chapter5urls.py from dj ango.urls import path from.import views#导入视图模块 urlpatterns=path(,test,views.showData)#URL 映射到视图函数 5.1.2返回错堤.Django nJ fl40 HTTP状态码和状态描述信息。,正常情况下,视图函数返回的HttpResponsef象的状 态代码为200,表示服务器正确处理了响应。-Django3提供了 一系列pResponse子类来返回各种 HTTP响应

4、,如表5-1所示。表 5-1 HttpResponse 子类HttpResponse 子类HTTP状态码说明HttpResponseRedirect302重定向到指定URL。HttpResponsePermanentRedirect301返回永久重定向。HttpResponseNotModified3。4表示自上次请求以来未修改页面。HttpResponseBadRequest4。0表示请求有错误。HttpResponseNotFound4。4HttpResponseForbidden4。3表示禁止访问请求的内容。HttpResponseNotAllowed4。5表示禁止使用指定的请求方法。H

5、ttpResponseGone4io表示访问请求的内容已经不存在。HttpResponseServerError5。0表示发生服务器内部错误。5.1.3处理Http404异常 HTTP 404错误表示服务器未找到客户请求的内容,这是最常见的HrTP错误。为了方便用户处理HTTP404错误,Dj ango提供了一个Http404异常类。.可在代代中用raise语句抛出Http404异常,示例代码如下。#chapter5chapter5views.py from dj ango.http import Http404 from dj ango.http import HttpResponsedef

6、 testHttp404(request):raise Http404(S:没有找到你需要的内容!)return HttpResponsefok)相应的URL配置如下:path(1 test4041,views.testHttp404),5.2处理请求和响应 Dj ango使用HttpRequest对象处理HTTP请求,使用HttpResponse对象处理HTTP响应。HttpRequest和HttpResponse类在dj ango.http模巾定义。,接收到客户端响应时,Dj ango首先创建一个HttpRequest对象,该对象封装了请求相关 的数据。然后Dj ango调用匹配的视图函数

7、,符HttpRequest对象传递给视图困数的第一 个参数。视图函数负责返回一个HttpResponse对象,该对象封装了响应相关的数据。本节主要内容 获取请求数据 生成PDF文件 处理响应内容 返EIJSON字符串 文件附件 使用响应模板 生成CSV文件 重定向5.2.1获取请求数据可用HttpRequest对象的下列属性获取客户端的请求数据。-GET:返回一个类字典的对象,它若装了客户端使用GET方法上传的数据。POST:返回一个类字典的对象,它若装了客户端使用POST方法上传的数据。-FILES:返回一个类字典的对象,它若装了客户端上传的所有文件。例如,下面的代码在浏览器中输出URL中包

8、含的数据。#chapter5chapter5views.py from dj ango.http import HttpResponsedef showGetData(request):s请求上传的数据:姓名二%s,年龄二s1(request.GETfnamelrequest.GETtage1)return HttpResponse(s)5.2.2处理喟应内容HttpResponse构造函数使用一个字符串参数来构造响应内容,示例代码如下。return HttpResponse(-级标题).默认情况下入电原内用日电1/1日 contentj ype参舞山直为谷类型成理界想电回京侬各式的响应内容,

9、可用 M,示例长4如下。return HttpResponse(-l,content_type=,ltext/plain;charset=utf-8)“text/plain”表示内容为纯文本,“charset=utf-8”设置了内容的字符集。,以使用write。函数向HttpResponse M象添加内容,示例代码如下。#chapter5chapter5views.py from dj ango.http import HttpResponsedef showSomething(request):r=HttpResponse(-级标题 content_type=,text/plain;char

10、set=utf-8,1)r.wite(kp 第二)r.writeCthree1)return r5.2.3文件附件 Dj ango允许将呵应内容c。湎.渗螂面器配般需豆返除需脐件附件需要设置#chapter5chapter5views.py def downloadFile(request):r=HttpResponse(文件内容,content_type=text/text;charset=utf-8)rtContent-Disposition1=attachment;filename=test.txt r.write(ntest)return r Content-Disposition头中

11、的attachment表示内容作为附件传递,filename设置默认文件 名。,相应的URL配置如下:pathCdown1,views.downloadFile),5.2.4生成CSV文件使用Python的csv库,可以生成CSV格式的文件。生成CSV文件的基本步骤如下。(1)创建 HttpResponse对象,并设 Scontentj ype Content-Disposition0(2)W HttpResponse对象作为csv.writer。的参数,创建CSV生成器。(3)调用CSV生成器的 wHterow。、writerows()等方法向 HttpResponse对 象写入数据。(4)

12、1 回 HttpResponse 对象。5.2.5生成PDF文件使用第三方的开源Python库ReportLab,可以在Dj ango视图中 动态生成PDF文件。在Windows命令窗口中执行下面的命令安装ReportLvb库。D:pip install reportlab面的代码使用ReportLab库生成PDF文件。#chapter5chapter5views.pydef writepdf(request):from reportlab.lib.units import cmfrom reportlab.pdfbase.ttfonts import TTFontfrom reportlab

13、.pdfbase import pdfmetricsfrom reportlab.pdfgen import canvasfrom reportlab.lib.colors import redresponse=HttpResponse(content_type=application/pdf)response Content-Disposition=attachment;filename=data.pdf,pdfmetrics.registerFonVTTFontCsongti/simsun.ttc)#注册中文字体,其文件在当前视图文件目录c=canvas.Canvas(response,p

14、agesize=(10*cm,5*cm)#生成指定大小的 PDF 布c.setFont(songti1,18)#设置注册的中文字体,以便正常显示汉字c.setFillColor(red)#设置颜色c.drawString(0.5*cm,4*cm,Python Dj ango Web 简明教程)#在指定位置输出字符串c.showPage()#结束当前页面c.save()#保存画布5.2.6返回JSON字符用 JsonResponseHttpResponse子类,用于封装JSON字符串响应,它符 Content-Type 的标 设置为 application/j son。例如,下面的代码向客户端返

15、回一个JSON字符串。#chapter5chapter5views.py def writej son(request):r=HttpResponse(content_type=application/j son;charset=utf-811)r.write(naine?张 H/datall23,abc)return r修改writej son函数,使用JsonResponse封装响应代码如下。from dj ango.http import JsonResponsedef writej son(request):return JsonResponseGname1:1 HVdataS/abc

16、1)5.2.7使用喟应模板直接在视图中通过代码招内容写入响应,如果后期需 要更改输出布局,则需要重新修改视图代码。这显然 不利于代码维护。-使 1 django.template.response1块中的 TemplateResponse,而以便M展板耒定义输出布局。5.2.8重定向dj ango.shortcuts模块中的redirect()方法用于快速创建重定向,其基本格式为:redirect(to,*args)参数口可以是模型中返IUURL的方法、视图名称或URL。例如:#chapter5chapter5views.pyfrom dj ango.shortcuts import redi

17、rectdef useRedirect(request):return redirect(showData,uHDataei23)#重定向到5.1.1 中定义的视图函数showData5.3在视图中使用模型视图不仅可以获取客户端上传的数据,还可以通过模 型访问后台的数据库本节主要内容在视图中输出模型数据数据分页5.3.1在视图中输出模型数据具体操作步骤如下。(1)在项目子文件夹chapte5中添加一个文件,命名为modes.py,在其中定义模型,代码如下。(2)在Windows命令窗口中执行下面的命令完成数据库if移操作。(3)解阳见图文件,定义一个函数符URL中的数据添加到数据库的user表

18、,并将user表中的全 部教辅返向客户端,代硝lU下。(4)修改urls.py,添加访问视图的URL配置,代码如下。(5)启动开发服务器。5.3.2数据分页-django.core.paginatori 块中的 Paginator 用于实现数 据分页。1.Paginato对象Paginator()构造函数用于创建Paginator对象(称为分页器),其基本格式如下。from dj ango.core.paginator import Paginator paginator=Paginator(obj ect_list,per_page,orphans=0,allow_empty_first_p

19、age=True)各参数含义如下:嚼徵力肥肥常膈那例鬣元组、列表或者其他可分片对象-per_page:每页中允许的最大对象数。必选参数。orphans:,:理于控制最后一页的对象数。如果剩余的对象数i于或等于orphans值,则这些对秦将被添加到上一页面,并使其成为最后一页。另选参薮二二二一,默认值为0。-allow_empty_first_page:是否允许第一页为空。可选参数,默认值为True,即允许 第一页为空。Paginator对象的常用属性如下。,count:返回所有页面中的对象总数。-num_pages:返回总页数。page_range:返回页码迭代器,页码从1开始。例如:from

20、 dj ango.core.paginator import Paginator obj ects=labc,ldef,lghi,123,456,789#侍分页对象集合-p=Paginator(obj ects,2)#构造分页器,每页2个对象 p.count 6 p.num_pages-3 p.page_range range(1,4)Paginator对象的常用方法如下。get_page(页码):返回指定页的Page对象,页码从1开始。垓方法 可处理超出范围或无效的页码。如果给定页码不是数字,则返 回第一页。如果给定页码小于1或大于总页数,则返回最后一页。,page(页码):返回指定页的Pa

21、ge对象,它不处理超出范围或无效 页码。指定的页码无效时会触发InvalidPage异常。例如 page1=p.get_page(1)#获取 Page 对象 page2=p.page(2)#获取 Page 对象2.Page对象,Page对象用于处理指定页。通常调用分页器的page。或get_page()方法获 得Page对象。-Page对象的属性如下。-obj ectj ist:返回当前页的对象列表。number:返回当前页的页码。paginator:返回关联的Paginator对象。Page对象的方法如下。has_next():有下一页时迟UlTrue,否则返回False。has_previ

22、ous():有上一页时返回True,否则返回False。has_other_pages():有上一页或下一页时返True,否则返回False。next_page_number():返回下一页的页码。previous_page_number():返回上一页的页码。start i:返回当成页中第匚啜,烫则同对露蝉冤儿索引从 每页包含2个对象,则第一页的1开始。例如龙用嗦成为 start_index()l 03o6,鹘翟掰6嘴曾基聘g2号需暮跚翻/虬o-3.对模型数据分页 5.3.1节中创建了 user模型,其对应的user表数据如图0 127.0.0.1:8000/model?name=X+-C

23、127.0.0.1:8000/model?name=&age=23 X 60默认数据库中的user表数据:id name ageJ三四 张李六七 赵燕2018五525.4基于类的视图基于类的视图指用类实现的视图,可通过定义其子类 进行扩展。,所有基于类的视图都是django.views.View的子类。本节主要内容 使用基于类的视图 设置视图类属性 扩展视图类5.4.1使用基于类的视典型的基于类的视图通常由HTTP请求处理方法实现,其基本结构如下。from dj ango.http import HttpResponsefrom dj ango.views import Viewclass M

24、yViewName(View):#继承 View 类#类的属性定义#类的方法定义def get(self,request):#HTTP GET i青求处理方法#业务遗辑处理代码return HttpResponse(result)def post(self,request):#HTTP POST 请求处理方法#业务遗辑处理代码return HttpResponse(result)1,MyViewName是自定义类的名称,它继承了 dj ango.views.View。get()方法用于处理HTTPGET请求,post。方法用于处理HTTP POST请求。注意,get()和post。的名称必须用

25、视图函数来处理HTTP请求,其基本结构如下。from dj ango.http import HttpResponsedef MyFuncionName(request):#变量定义if request.method=GET:#处理 HTTP GETifi 求#业务辑处理代码return HttpResponse(result)if request.method=POST:#处理HTTP POST#求#业务遢辑处理代码return HttpResponse(result)需躅备鼾URL时,如果URL与模式也配,则调用相应在配置基于类的视图时,需将URL模式映射到视图类需 as_view()方法

26、。Django处理视图类的基本步骤如下。,第一步j执行as_view()方法,倒建一个类的实例。第二步:调用setup。方法初始化实例的属性。,第三步:调用dispatch。方法,南蜀HTTP萌*方式(GET或POST 里)调用匹配的实例方发 如巢系有匹量的实例方法,110 HttpResponseNotAllowed m 应。5.4.2设置视图类属性Dj ango允许在配置基于类的视图时,在as_view()方法中设置视图类的属 性示例代码如下。#chapter5chapter5urls.py uripatterns=path(useviewpaa csrf_exenipt(views.us

27、eClassView.as_view(news=用指定属性值访 问视图类),5.4.3扩展视图类对视图类进行扩展,可重载类的属性和方法,示例代码如下。#chapter5chapter5views.pyfrom dj ango.views import Viewclass useClassView(View):class subClassView(useClassView):news这是视图类useClassView的扩展类!def get(self,request):#重载get()方法out=self.news+重载get()方法输出:请在输入数据后提交!,+self.form return

28、 HttpResponse(out)5.5内置通用视图本节主要内容通用视图DetailView,通用视图ListView5.5.1 通用视图DetaiMew-DetailView用于显示单个模型对象的数据。通常精况下,在URL中向视图提交对象的id,视图使用id获得模型对象,并将模型对 象传递给模板。,例虬 使用DetailView显示user表中特定用户的数据。首先,扩展DetailView类,代码如下。其次,定义模板。默认情况下,DetailView子类使用的模板文件名为“模型名称-detail.htmr5 0本例中使用的模型名称为user,所以默认的模板文件名称为 user_detail

29、.htmlo本例中,项目名称为chapters,Dj ango默认在“chapter5chapter5templateschapter5 目录中搜索 user_detail.html 文件。,最后,配置URL访问userDetailView视图5.5.2 通用视图 ListViewListView用于显示多个模型对象的数据,数据显示格式由模板 定义。本节在实例中使用ListView显示user表的全部数据。首先,犷展ListView类,代码如下:.其次,定义模板。本例中,userListView视图默认使用的模板文件名称 user_list.html,其代码如下:,最后,配置URL访问userListView视图5.6实践:图形校验码本节主要内容

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 人力资源管理师考试

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服