版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章视图《PythonWeb企业级项目开发教程(Django版)(第2版)》学习目标/Target了解什么是视图,能够说出视图的基本结构掌握QueryDict对象的使用,能够使用该对象处理查询字符串和表单数据掌握响应对象的使用,能够通过HttpResponse类处理响应掌握请求对象的使用,能够通过HttpRequest类处理请求学习目标/Target掌握生成响应的快捷方式,能够通过快捷方式生成响应掌握类视图如何定义,能够定义并使用类视图熟悉基础类视图,能够归纳基础类视图的作用掌握视图装饰器的使用,能够根据视图装饰器控制视图的行为熟悉通用视图分类,能够归纳各视图的作用学习目标/Target熟悉通用显示视图与模型,能够归纳ListView和DetailView的使用场景熟悉如何添加额外的上下文对象,能够通过重写get_context_data()实现添
加额外的上下文对象熟悉异步视图的定义,能够说明异步视图的作用掌握如何修改查询集结果,能够通过queryset属性和重写get_queryset()
方法修改查询集结果章节概述/Summary视图在Django中扮演着非常重要的角色,它用于处理来自用户的HTTP请求并生成相应的HTTP响应。视图是连接用户和应用程序逻辑之间的桥梁,负责处理请求数据、执行业务逻辑以及渲染响应内容。本章将对视图相关的内容进行讲解。目录/Contents010203认识视图请求对象QueryDict对象04响应对象05生成响应的便捷函数目录/Contents0607视图装饰器类视图08通用视图09异步视图认识视图5.1
先定一个小目标!了解什么是视图,能够说出视图的基本结构5.1认识视图在Web开发中,视图是处理用户请求并生成响应的一部分。视图负责接收来自用户的请求,处理请求的数据,并返回一个包含HTML、JSON、XML或其他格式的响应。视图通常是以函数或类的形式的出现,它与URL模式相关联。当用户访问特定URL时,路由系统将匹配到相应的视图,并调用该视图来处理请求。5.1认识视图视图函数由Python中的函数实现,类视图由Python中的类实现。以视图函数为例介绍视图的基本结构,结构如下所示。5.1认识视图defview_name(request,*args=None,**kwargs=None):
代码段
returnHttpResponse(response)使用以上结构便可定义一个视图函数。以上结构中的view_name表示视图名称;参数request是必选参数,用于接收请求对象(HttpRequest类的实例);参数args和kwargs为可选参数,用于接收URL中的额外参数;返回值HttpResponse(response)表示响应对象(HttpResponse类或其子类的实例)。5.1认识视图示例演示定义一个视图函数curr_time(),它的功能是返回当前的日期和时间,具体步骤如下。首先,创建chapter05项目和book应用,在book应用的views.py文件中定义视图函数curr_time(),具体代码如下。示例演示fromdjango.httpimportHttpResponseimportdatetimedefcurr_time(request):now=datetime.datetime.now()response="<html><body>当前时间为:%s.</body></html>"%nowreturnHttpResponse(response)5.1认识视图示例演示然后,在chapter05项目的urls.py文件中配置该视图函数关联的URL模式,具体代码如下。示例演示fromdjango.contribimportadminfromdjango.urlsimportpathfrombookimporturlpatterns=[path('admin/',admin.site.urls),path('time/',views.curr_time),]5.1认识视图示例演示运行开发服务器,在浏览器地址栏中访问:8000/time/,此时页面会显示当前的日期和时间,如图所示。示例演示请求对象5.2
先定一个小目标!掌握请求对象的使用,能够通过HttpRequest类处理请求5.2请求对象在Django中,请求对象是一个HttpRequest类的实例,它代表了一个HTTP请求。每当用户发送请求时,Django会创建一个HttpRequest对象,并将其传递给相应的视图函数来处理请求。通过HttpRequest类内定义的属性和方法可以访问与HTTP请求相关的信息。5.2请求对象1.HttpRequest类的常用属性HttpRequest类提供了一系列属性获取HTTP请求信息,包括请求协议、请求方法、请求参数、请求对象等。5.2请求对象选项说明scheme表示请求的协议,如http或httpsbody表示请求的主体内容,通常在POST请求中包含表单数据path表示请求的路径部分,不包括域名和查询参数path_info表示经过URL解码处理的路径部分,与path的值相同,但可能包含特殊字符method表示请求的HTTP方法,如GET、POST等encoding表示请求的编码方式content_type表示请求的内容类型content_params表示请求内容的附加参数5.2请求对象选项说明GET包含所有GET请求参数的类似字典的QueryDict对象POST包含所有POST请求参数的类似字典的QueryDict对象COOKIES包含所有请求Cookie的类似字典的对象META包含了关于请求的元数据信息,提供了有关客户端、服务器和请求本身的各种详细信息headers表示请求的头部信息current_app当前正在处理请求的应用程序的名称session表示请求对应的会话对象user表示发起请求的用户对象1.HttpRequest类的常用属性HttpRequest类提供了一系列属性获取HTTP请求信息,包括请求协议、请求方法、请求参数、请求对象等。若在定义的视图函数中需要获取请求协议、请求方法、请求头信息等,那么可以通过参数request进行获取。例如,在book应用的views.py文件中定义视图函数show_http_info(),并在该视图函数中获取请求协议、请求方法、请求头信息,具体代码如下。5.2请求对象fromdjango.httpimportHttpResponsedefshow_http_info(request):scheme=request.schememethod=request.methodheaders=request.headersresponse="<html><body><p>请求协议:%s</p><p>请求方法:%s</p>"\"<p>请求头信息:%s</p></body></html>"%(scheme,method,headers)returnHttpResponse(response)在chapter05项目的urls.py文件中配置该视图函数关联的URL模式,具体代码如下。urlpatterns=[path('http-info/',views.show_http_info),]5.2请求对象运行开发服务器,在浏览器的地址栏中访问:8000/http-info/,此时页面会显示请求协议、请求方法、请求头信息,如图所示。访问META属性后会返回一个包含请求元数据信息的字典,在这个字典中key值表示一个HTTP头字段的名称。常见的HTTP头字段及其含义如表所示。选项说明CONTENT_LENGTH请求的主体内容长度CONTENT_TYPE请求的内容类型HTTP_ACCEPT客户端接受的响应内容类型HTTP_ACCEPT_ENCODING客户端接受的编码方式HTTP_ACCEPT_LANGUAGE客户端接受的语言HTTP_HOST请求的目标主机名HTTP_USER_AGENT客户端的用户代理(浏览器)信息5.2请求对象选项说明QUERY_STRING请求的查询字符串REMOTE_ADDR客户端的IP地址REMOTE_HOST客户端的主机名REQUEST_METHOD请求的HTTP方法SERVER_NAME服务器的主机名SERVER_PORT服务器的端口号访问META属性后会返回一个包含请求元数据信息的字典,在这个字典中key值表示一个HTTP头字段的名称。常见的HTTP头字段及其含义如表所示。5.2请求对象若在定义的视图函数中需要使用请求的内容类型、服务器端口号等数据,那么可以通过参数request进行获取。例如,在book应用的views.py文件中定义视图函数show_info(),并在该视图函数中获取请求的内容类型、服务器端口号,具体代码如下。fromdjango.httpimportHttpResponsedefshow_info(request):content_type=request.META.get('CONTENT_TYPE','')port=request.META.get('SERVER_PORT','')response="<html><body><p>请求类型:%s</p>"\"<p>端口号:%s</p></body></html>"%(content_type,port)returnHttpResponse(response)5.2请求对象在chapter05项目的urls.py文件中配置该视图函数关联的URL模式,具体代码如下。urlpatterns=[path('show-info/',views.show_info),]5.2请求对象运行开发服务器,在浏览器的地址栏中访问:8000/info/,此时页面会显示请求的类型和端口号,如图所示。2.HttpRequest类的常用方法HttpRequest类提供了一系列方法处理和操作HTTP请求,比如获取完整的请求路径、判断请求是否为POST请求等。5.2请求对象选项说明auser()返回一个代表当前已登录用户的实例,该方法适用于异步上下文read()读取请求的主体内容readline()逐行读取请求的主体内容readlines()读取请求的主体内容,并返回一个包含每行内容的列表get_host()返回请求的主机名,包括可能的端口号get_port()返回请求的目标端口号get_full_path()返回请求的完整路径,包括查询参数is_secure()用于检查当前请求是否通过安全的HTTPS协议进行若在定义的视图函数中需要使用请求的主机名和请求的完整路径,那么可以通过参数request进行获取。例如,在book应用的views.py文件中定义视图函数info(),并在该视图函数中获取请求的主机名和请求的完整路径,具体代码如下。fromdjango.httpimportHttpResponsedefinfo(request):host=request.get_host()full_path=request.get_full_path()response="<html><body><p>主机名:%s</p>"\"<p>请求完整路径:%s</p></body></html>"%(host,full_path,)returnHttpResponse(response)5.2请求对象在chapter05项目的urls.py文件中配置该视图函数关联的URL模式,具体代码如下。urlpatterns=[path('info/',),]5.2请求对象运行开发服务器,在浏览器的地址栏中访问:8000/info/,此时页面会显示主机名和请求完整路径,如图所示。QueryDict对象5.3
先定一个小目标!掌握QueryDict对象的使用,能够使用该对象处理查询字符串和表单数据5.3QueryDict对象当HttpRequest对象访问GET属性或POST属性后,会返回一个QueryDict对象。QueryDict对象是一个用于处理查询字符串和表单数据的类。它是HttpRequest对象的一部分,用于解析和操作HTTP请求中的参数。QueryDict类是Python字典的子类,实现了字典中所有的方法,除此之外,QueryDict内部也实现一系列方法来处理查询字符串和表单数据。5.3QueryDict对象QueryDict类的常用方法如表所示。5.3QueryDict对象选项说明get()获取指定键的值。如果该键不存在,则返回默认值items()返回一个键值对的迭代器,可以用于遍历QueryDict对象的所有键值对keys()返回一个包含所有键的列表values()返回一个包含所有值的列表getlist()获取指定键的所有值,返回一个列表。如果该键不存在,则返回默认值setlist()用于设置指定键的值列表appendlist()将值添加到指定键的值列表中update()用另一个QueryDict对象的内容更新当前QueryDict对象urlencode()将QueryDict对象转换为适合在URL查询字符串中使用的格式,并返回转换后的字符串若希望在定义的视图函数中获取GET请求的内容,那么可以先通过request.GET获取包含所有GET请求参数的QueryDict对象,再通过该对象调用get()方法进行获取。例如,在book应用的views.py文件中定义视图函数personal(),并在该视图函数中获取GET请求中的姓名、年龄和城市,具体代码如下。fromdjango.httpimportHttpResponsedefpersonal(request):name=request.GET.get('name','Unknown')age=request.GET.get('age','Unknown')city=request.GET.get('city','Unknown')response_str=f"Name:{name},Age:{age},City:{city}"returnHttpResponse(response_str)5.3QueryDict对象5.3QueryDict对象在chapter05项目的urls.py文件中配置该视图函数关联的URL模式,具体代码如下。urlpatterns=[path('personal/',views.personal),]运行开发服务器,在浏览器的地址栏中访问:8000/personal/?name=John&age=30,此时页面会显示姓名、年龄和城市,如图所示。响应对象5.45.4.1HttpResponse类
先定一个小目标!掌握响应对象的使用,能够通过HttpResponse类处理响应在处理响应对象时,我们需要确保用户的个人信息不会被不当地暴露在响应中,从而保障用户的隐私权。其次,开发者应当具备正确的价值观和道德底线。在编写响应对象时,要避免传播虚假信息、歧视性言论或者违反社会公共道德的内容。例如,一个社交平台的响应对象应当能够过滤掉仇恨言论,以维护社会和谐。5.4.1HttpResponse类在Django中,响应对象(HttpResponse)用于构建和返回HTTP响应。它是一个包含HTTP响应内容和相关信息的对象,可以用来向客户端发送数据、状态码和其他与HTTP响应相关的内容。5.4.1HttpResponse类5.4.1HttpResponse类通过HttpResponse类内定义的属性和方法用于设置和获取与HTTP响应相关的信息。1.HttpResponse类的常用属性HttpResponse类的常用属性如表所示。属性说明content表示响应的内容,可以是字符串、字节串或可迭代对象cookies表示响应中包含的Cookie。它是一个字典,包含了响应中所有的Cookie信息headers表示响应的头部信息。它是一个字典,包含了所有的头部字段和值status_code表示响应的状态码。它指示服务器对请求的处理结果charset表示响应的字符集。它指定了响应内容使用的字符编码closed表示响应是否已关闭reason_phrase表示响应状态码的原因短语若在定义的视图函数中需要指定响应内容,那么可以通过content属性进行设置。例如,在book应用的views.py文件中定义视图函数resp(),并在该视图函数中将响应内容设置为“Hello,World!”,具体代码如下。fromdjango.httpimportHttpResponsedefresp(request):response=HttpResponse()response.content="Hello,World!"returnresponse5.4.1HttpResponse类在chapter05项目的urls.py文件中配置该视图函数关联的URL模式,具体代码如下。urlpatterns=[path('resp/',views.resp),]运行开发服务器,在浏览器的地址栏中访问:8000/resp/,此时页面会显示设置的响应内容,如图所示。5.4.1HttpResponse类2.HttpResponse类的常用方法HttpResponse类提供了一系列方法处理和操作HTTP响应。(1)__init__()方法__init__()方法是HttpResponse类的构造方法,该方法使用给定的页面内容和内容类型创建HttpResponse对象。__init__()方法的格式如下所示。5.4.1HttpResponse类__init__(content=b'',content_type=None,status=200,reason=None,charset=None,headers=None)语法格式content:表示要包含在HTTP响应中的内容。默认为一个空字节串(b''),可以是字符串或字节串。content_type:表示HTTP响应的Content-Type头部字段的值,指定了响应内容的MIME类型。如果未提供,则不会设置Content-Type头部字段。status:表示HTTP响应的状态码。默认为200,表示请求成功。5.4.1HttpResponse类__init__(content=b'',content_type=None,status=200,reason=None,charset=None,headers=None)语法格式reason:表示HTTP响应状态码的原因短语。如果未提供,则使用与状态码相对应的默认原因短语。charset:表示HTTP响应内容的字符集。如果未提供,则不会设置字符集。headers:表示要添加到HTTP响应中的其他头部字段。它的值是一个字典,包含要设置的头部字段及其对应的值。例如,在book应用的views.py文件中定义视图函数say_hello(),并在该视图函数中通过HttpResponse类设置响应内容为“HelloDjango!”,示例代码如下所示。fromdjango.httpimportHttpResponsedefsay_hello(request):returnHttpResponse(content='HelloDjango!')5.4.1HttpResponse类(2)get()方法get()方法用于获取响应头部中指定字段的值。如果找到了指定的字段,则返回其对应的值;如果找不到,则返回默认值None。get()方法的语法格式如下所示。5.4.1HttpResponse类get(header,alternate=None)语法格式header:表示要获取值的响应头部字段名称。alternate:可选参数,表示当指定的响应头部字段不存在时,返回的备用值。如果未提供备用值,则默认为None。5.4.1HttpResponse类例如,在book应用的views.py文件中定义视图函数get_http_host(),并在该视图函数中获取指定响应头信息,示例代码如下所示。fromdjango.httpimportHttpResponsedefget_http_host(request):response=HttpResponse()#创建响应对象
response['Custom-Header']='CustomValue' #设置响应头信息
content_type=response.get('Custom-Header') #获取设置的响应头信息
returnHttpResponse(f'{content_type}')5.4.1HttpResponse类(3)items()方法items()方法用于返回一个包含响应头部所有字段和值的迭代器。每个迭代项都是一个元组,其中第一个元素是字段名称,第二个元素是字段的值。例如,在book应用的views.py文件中定义视图函数get_http_info(),并在该视图函数中获取响应头信息,示例代码如下所示。fromdjango.httpimportHttpResponsedefget_http_info(request):response=HttpResponse() response['Content-Type']='text/plain' response['Custom-Header']='CustomValue' header_items=response.items() returnHttpResponse(f'{header_items}')5.4.1HttpResponse类(4)set_cookie()方法set_cookie()方法用于设置响应的cookie,这个方法允许向客户端发送一个带有指定名称和值的cookie。该方法的语法格式如下。set_cookie(key,value='',max_age=None,expires=None,path='/',domain=None,secure=False,httponly=False,samesite=None)语法格式key:cookie的名称,字符串类型。value:cookie的值,字符串类型。max_age:cookie的生存周期,以秒为单位。默认为None,表示该cookie将一直存在,直到浏览器关闭为止。5.4.1HttpResponse类set_cookie(key,value='',max_age=None,expires=None,path='/',domain=None,secure=False,httponly=False,samesite=None)语法格式max_age:cookie的生存周期,以秒为单位。默认为None,表示该cookie将一直存在,直到浏览器关闭为止。expires:cookie的过期时间,它的值必须为一个datetime对象或符合“Wdy,DD-Mon-YYYYHH:MM:SSGMT”格式的字符串。默认为None,表示该cookie将一直存在,直到浏览器关闭为止。。path:指定cookie适用的服务器路径。默认为'/',表示整个网站都可以访问该cookie。secure:布尔值,表示cookie是否只能通过HTTPS连接传输。默认为False。httponly:布尔值,表示cookie是否设置为HTTPOnly,即限制JavaScript访问该cookie。默认为False。5.4.1HttpResponse类例如,在book应用的views.py文件中定义视图函数http_set_cookie(),并在该视图函数中设置Cookie信息,示例代码如下所示。defhttp_set_cookie(request):response=HttpResponse("cookie设置完成")#创建响应对象
#通过响应对象设置cookie信息,并设置过期时间为3600秒
response.set_cookie(key='username',value='john_doe',max_age=3600)returnresponse5.4.1HttpResponse类(5)delete_cookie()方法del_cookie()方法用于在HTTP响应中删除指定的cookie,该方法的语法格式如下。delete_cookie(key,path='/',domain=None,samesite=None)语法格式key:表示要删除的cookie的名称,字符串类型。path:指定要删除的cookie的路径。默认为'/',表示删除与整个网站关联的cookie。domain:指定要删除的cookie的域名。如果不提供,默认为当前请求的域名。samesite:定义cookie的SameSite属性,取值可以是'Strict'(完全禁止跨站点请求)、'Lax'(仅允许GET跨站点请求)或'None'。默认值为None,表示被设置为浏览器的默认行为。5.4.1HttpResponse类例如,在book应用的views.py文件中定义视图函数http_delete_cookie(),并在该视图函数中删除指定Cookie信息,示例代码如下所示。defhttp_delete_cookie(request):response=HttpResponse("删除cookie完成")response.delete_cookie(key='username')#删除名称为username的信息
returnresponse5.4.1HttpResponse类(6)set_signed_cookie()方法set_signed_cookie()方法用于设置带有签名的cookie的方法。签名的cookie在客户端和服务器之间传输时会自动进行验证,确保其完整性和安全性。例如,在book应用的views.py文件中定义视图函数signed_cookie(),并在该视图函数中设置Cookie信息,示例代码如下所示。defsigned_cookie(request):response=HttpResponse("cookie设置完成")#创建响应对象
#通过实例化对象设置cookie信息,并设置过期时间为3600秒
response.set_signed_cookie(key='username',value='john_doe',max_age=3600)returnresponse5.4.2HttpResponse的子类
先定一个小目标!掌握响应对象的使用,能够通过HttpResponse子类处理响应Django还提供了许多HttpResponse的子类,通过这些子类可以更方便地创建各种类型的响应,提高开发效率和代码可读性。子类说明HttpResponseRedirect用于执行临时重定向,将请求重定向到另一个URLHttpResponsePermanentRedirect用于执行永久重定向,将请求重定向到另一个URLHttpResponseNotModified用于返回HTTP304NotModified响应,表示客户端缓存的资源仍然有效,无需重新传输HttpResponseBadRequest用于返回HTTP400BadReques响应,表示客户端请求有误5.4.2HttpResponse的子类Django还提供了许多HttpResponse的子类,通过这些子类可以更方便地创建各种类型的响应,提高开发效率和代码可读性。子类说明HttpResponseNotFound用于返回HTTP404NotFound响应,表示请求的资源不存在HttpResponseNotAllowed用于返回HTTP405MethodNotAllowed响应,表示客户端使用了服务器不允许的HTTP方法JsonResponse用于返回JSON格式的响应,将Python对象转换为JSON格式并进行响应HttpResponseForbidden表示HTTP403Forbidden状态码,表示服务器理解请求,但拒绝执行请求HttpResponseServerError表示HTTP500InternalServerError状态码,表示服务器在处理请求时发生了内部错误5.4.2HttpResponse的子类1.HttpResponseRedirect类HttpResponseRedirect的使用非常简单,只需要创建一个实例对象,然后将重定向的URL作为参数传入即可。这个URL可以是完整的路径,比如/,也可以是不包含域名的绝对路径或相对路径,比如/search/或search/。示例代码如下。#创建响应对象,使用完整路径指定重定向的URLHttpResponseRedirect("/")#创建响应对象,使用绝对路径指定重定向的URLHttpResponseRedirect("/search/")#创建响应对象,使用相对路径指定重定向的URLHttpResponseRedirect("search/")5.4.2HttpResponse的子类5.4.2HttpResponse的子类需要注意HttpResponseRedirect只支持硬编码链接,不能直接使用URL名称,若要使用URL名称,需要先使用反向解析方法reverse()解析URL,例如使用命名空间blog下名为article_list的URL,示例代码如下。HttpResponseRedirect(reverse('blog:article_list'))HttpResponseRedirect默认返回302状态码和临时重定向,可以通过参数status重设状态码、设置参数permanent值为True以返回永久重定向。使用类HttpResponsePermanentRedirect可直接返回永久重定向(状态码为301)。2.JsonResponseJSON是Web开发中常用的数据格式,视图函数常常需要返回JSON类型的响应。HttpResponse的子类JsonResponse能更方便地实现此项功能。使用JsonResponse返回JSON类型的响应,示例代码如下。fromdjango.httpimportJsonResponsedefjson_view(request):response=JsonResponse({'foo':'bar’})returnresponse5.4.2HttpResponse的子类默认情况下,JsonResponse只能响应字典类型的数据,若要响应非字典类型的数据,需要通过参数safe进行指定,该参数用于指定是否允许将非字典类型的数据作为JSON响应,若为True,表示只允许字典类型的数据作为JSON响应;若为False,表示允许非字典类型的数据也可以作为JSON响应。示例代码如下。fromdjango.httpimportJsonResponsedefjson_view(request):response=JsonResponse(['coding','fish'],safe=False)returnresponse5.4.2HttpResponse的子类HttpResponse也能满足返回JSON类型的响应,但在返回之前需要先通过json模块调用dumps()函数将数据转储为JSON字符串。生成响应的便捷函数5.55.5.1render()函数
先定一个小目标!掌握生成响应的快捷方式,能够通过render()函数将数据渲染到指定的模板中5.5.1render()函数render()函数是django.shortcuts模块中的一个便捷函数,它会结合给定的模板和上下文字典渲染模板,并将渲染后的内容作为响应返回,即返回一个HttpResponse对象。该函数的语法格式如下。render(request,template_name,context=None,content_type=None,status=None,using=None)语法格式request:表示当前的请求对象。template_name:表示要使用的模板名称。context:表示要传递给模板的上下文数据。默认为None。content_type:表示响应的内容类型。默认为None,表示使用默认的MIME类型。status:表示响应的状态码。默认为None,表示使用200状态码。using:表示使用的数据库别名。默认为None。通过一个案例演示render()函数的基本使用,案例的效果是将获取的当前时间渲染到模板文件中,具体步骤如下。(1)在chapter05项目中创建templates文件夹,在该文件夹中创建名称为time的HTML文件,此时创建好的项目结构如图所示。5.5.1render()函数示例演示(2)在settings.py文件的TEMPLATES配置项的DIRS选项中指定模板文件所在位置,具体配置如下。5.5.1render()函数示例演示TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[os.path.join(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',],},},](3)配置完成之后,便可以在book应用中定义视图函数,并在视图函数中使用render()函数将响应内容渲染到time.html文件中,示例代码如下所示。5.5.1render()函数示例演示fromdjango.shortcutsimportrenderdefcurr_time(request):now=datetime.datetime.now()time=now.strftime("%Y-%m-%d%H:%M:%S")context={'time':time,}returnrender(request,"time.html",context)(4)视图函数定义完成之后,需要在time.html文件中将要响应的数据进行渲染,示例代码如下。5.5.1render()函数示例演示<body>
当前时间为:{{now}}</body>运行开发服务器并访问:8000/time/,便可以在HTML页面中显示当前时间,如图所示。5.5.2redirect()函数
先定一个小目标!掌握生成响应的快捷方式,能够通过redirect()函数重定向到指定的URLredirect()函数是一个快速生成重定向HTTP响应的函数。它可以将用户重定向到指定的URL或视图,该函数格式如下。redirect(to,*args,permanent=False,**kwargs)语法格式to:表示要重定向的目标URL或视图。它的值可以是一个表示URL路径的字符串,也可以是一个视图函数名,Django将根据该函数名自动解析出对应的URL。*args和**kwargs:可选参数,用于传递额外的动态参数给目标URL或视图函数。permanent:可选参数,表示是否使用永久重定向(301)。默认为False,即使用临时重定向(302)。5.5.2redirect()函数例如,在book应用的views.py文件中定义视图函数redirect_demo(),并在该函数中使用redirect()指定重定向地址为百度首页,示例代码如下。fromdjango.shortcutsimportredirectdefredirect_demo(request):returnredirect('/')#重定向到百度首页视图函数定义为完成,还需在项目的urls.py文件中为该视图函数定义URL模式,具体代码如下。5.5.2redirect()函数path('bd/',views.redirect_demo)运行开发服务器并访问:8000/bd/,便可以在HTML页面中显示百度首页,如图所示。5.5.2redirect()函数5.5.3get_object_or_404()函数
先定一个小目标!掌握生成响应的快捷方式,能够通过get_object_or_404()函数从数据库获取指定模型的单个对象get_object_or_404()函数用于从数据库中获取指定模型的单个对象。如果该对象不存在,则会引发Http404异常。该函数的语法格式如下。get_object_or_404(klass,*args,**kwargs)语法格式klass:表示要获取对象的模型类。*args和**kwargs:传递给查询的位置参数或关键字参数,数量是任意的。这些参数将被解释为筛选条件,用于从数据库中获取符合条件的对象。例如,id=1表示获取id值为1的对象。5.5.3get_object_or_404()函数通过一个案例演示get_object_or_404()函数的使用,在该案例中。在book应用的models.py文件中定义模型类BookInfo,具体代码如下。示例演示5.5.3get_object_or_404()函数fromdjango.dbimportmodelsclassBookInfo(models.Model):name=models.CharField(max_length=20,verbose_name="图书名称")read_count=models.IntegerField(default=0,verbose_name="阅读量")comment_count=models.IntegerField(default=0,verbose_name="评论量")is_delete=models.BooleanField(default=False,verbose_name="逻辑删除")def__str__(self):return模型类定义完成之后,将book应用添加到settings.py文件的INSTALLED_APPS选项中,然后再依次执行生成迁移文件以及执行迁移文件命令。在book应用的views.py文件中定义视图函数my_view(),并在该视图函数中使用get_object_or_404()函数,查询模型类BookInfo生成的数据表中id值为1的数据,示例代码如下。示例演示5.5.3get_object_or_404()函数fromdjango.shortcutsimportget_object_or_404from.modelsimportBookInfodefmy_view(request):obj=get_object_or_404(BookInfo,id=1)returnHttpResponse(f'图书名称:{}阅读量:{obj.read_count}')视图函数定义为完成,还需在项目的urls.py文件中为该视图函数定义URL模式,具体代码如下。示例演示5.5.3get_object_or_404()函数path('book-info/',views.my_view)运行开发服务器并访问:8000/book-info/,因为数据表中没有插入数据,所以页面会显示“Pagenotfound”,如图所示。5.5.4get_list_or_404()函数
先定一个小目标!掌握生成响应的快捷方式,能够通过get_object_or_404()函数从数据库获取一个对象列表get_list_or_404()函数用于从数据库中获取一个对象列表,如果找不到匹配的对象,则引发Http404异常。该函数的语法格式如下。get_listt_or_404(klass,*args,**kwargs)语法格式klass:表示要获取对象的模型类。*args和**kwargs:传递给查询的位置参数或关键字参数,数量是任意的。这些参数将被解释为筛选条件,用于从数据库中获取符合条件的对象。例如,id__lte=3表示获取id值小于等于3的对象列表。5.5.4get_list_or_404()函数在book应用的views.py文件中定义视图函数my_list_view(),并在该视图函数中使用get_list_or_404()函数,查询模型类BookInfo生成的数据表中id值小于等于3的数据,示例代码如下。5.5.4get_list_or_404()函数fromdjango.shortcutsimportget_object_or_404from.modelsimportBookInfodefmy_list_view(request):obj=get_list_or_404(BookInfo,id__lte=3)#id值小于等于3returnHttpResponse(f'图书名称:{obj[0].name}'f'阅读量:{obj[0].read_count}')视图函数定义为完成,还需在项目的urls.py文件中为该视图函数定义URL模式,具体代码如下。5.5.4get_list_or_404()函数path('book-list/',views.my_list_view)运行开发服务器并访问:8000/book-list/,因为数据表中没有插入数据,所以页面会显示“Pagenotfound”。视图装饰器5.65.6视图装饰器
先定一个小目标!掌握视图装饰器的使用,能够根据视图装饰器控制视图的行为视图装饰器用于修改或扩展Django框架中的视图函数的行为。它们可以在不修改原始视图函数代码的情况下,添加额外的逻辑和功能,比如检查用户权限、跟踪日志、缓存页面等。5.6视图装饰器视图装饰器说明require_http_methods()用于限制视图只能接受特定的HTTP方法require_GET()用于限制视图只能接受GET方法require_POST()用于限制视图只能接受POST方法require_safe()用于保护视图函数只能被安全的HTTP请求方法(GET、HEAD、OPTIONS)访问login_required()用于保护视图,只允许已登录用户访问csrf_exempt()用于跳过CSRF保护,允许在POST请求中提交数据而无需提供CSRF令牌安全的HTTP请求方法是指请求方法不会对服务器上的资源进行实质性修改,不会改变资源的状态。因此,GET、HEAD和OPTIONS被认为是安全的HTTP请求方法。与安全方法相对应的是非安全的HTTP请求方法,这些方法会对服务器上的资源进行修改,可以增加、更新或删除数据。因此,POST、PUT和DELETE被认为是非安全的HTTP请求方法。5.6视图装饰器视图装饰器的使用方式较为简单,只需放置在视图函数定义的上方即可。语法格式如下。@decorator_namedeftest(arg1,arg2,...):#函数体5.6视图装饰器上述格式中@decorator_name表示要使用的视图装饰器,test()表示定义的视图函数。例如,在book应用的views.py文件中定义视图函数http_demo(),并在该视图函数上方使用装饰器require_http_methods()指定允许的请求方式为GET和POST,具体代码如下所示。fromdjango.views.decorators.httpimportrequire_http_methods@require_http_methods(['GET','POST'])defhttp_demo(request):ifrequest.method=='GET':returnHttpResponse('GET请求')elifrequest.method=='POST':returnHttpResponse('POST请求')5.6视图装饰器上述示例代码中,视图函数http_demo()通过装饰器require_http_methods()指定了能够处理的HTTP请求,如果接收的HTTP请求方法不是GET或POST,那么将返回MethodNotAllowed错误响应。类视图5.75.7.1定义类视图
先定一个小目标!掌握类视图如何定义,能够定义并使用类视图类视图是以类的形式处理请求,在类中需要定义与请求方式同名的方法,例如,如果要处理GET请求,那么需要在类中定义get()方法。Django提供了许多类视图,用于处理各种类型的HTTP请求。这些类视图可以根据你的需求进行继承和扩展,并提供了丰富的功能和便利性。其中最基础的类视图是View类,并且该类是所有类视图的基类,它用于处理视图与URL的连接、HTTP方法的调度以及其他简单的功能;除了View类,Django还提供了一些特定功能的类视图。5.7.1定义类视图例如,在book应用中的views.py文件中定义继承View类的类视图MyView,并在该类视图中处理GET请求和POST请求,具体示例代码如下。fromdjango.httpimportHttpResponsefromdjango.viewsimportViewclassMyView(View): #继承View类
defget(self,request): #处理GET请求
returnHttpResponse('GET请求') defpost(self,request): #处理POST请求
returnHttpResponse('POST请求')因为在Django中,URL路由配置需要指定一个可调用的视图函数来处理请求,所以当定义类视图处以后,需要在URL路由配置中将类视图转换为视图函数。5.7.1定义类视图在Django中提供了一个as_view()方法,该方法用于将类视图转换为可调用的函数。它返回一个包装了类视图的函数,可以直接用于处理HTTP请求。在项目的urls.py中配置URL,调用以上定义的类视图,示例代码如下。path('about/',views.MyView.as_view()),以上示例中的path()函数在接收到URL模式为“about/”的请求时,会调用MyView类的as_view()方法,并根据不同的请求方式执行类视图MyView中的不同方法。5.7.1定义类视图运行开发服务器并访问:8000/about/,此时页面显示类视图MyView处理请求的响应内容,如图所示。因为用户访问网页,通常会使用GET请求来获取页面内容,所以响应内容为类视图MyView中get()方法响应的内容。5.7.1定义类视图5.7.2基础类视图
先定一个小目标!熟悉基础类视图,能够归纳基础类视图的作用基础类视图是一组提供常见功能的预定义类视图,用于简化开发过程。这些基础类视图提供了一些通用的功能,可以用于处理常见的HTTP请求和响应。除了View之外,Django还提供了多个基础类视图。例如,TemplateView和RedirectView。5.7.2基础类视图1.TemplateViewTemplateView类视图用于呈现静态模板,该类视图会指定一个模板作为渲染响应,并可以传递额外的上下文数据给模板。TemplateView的功能源于它继承的三个类:TemplateResponseMixin、ContextMixin和View,这三个类的功能说明分别如下。(1)TemplateResponseMixin:该类提供了将模板渲染为响应的功能。它定义了一个名为render_to_response()的方法,用于渲染指定的模板并返回一个HttpResponse对象。TemplateView类利用这个方法来实现将模板渲染为响应的功能。5.7.2基础类视图(2)ContextMixin:该类提供了传递上下文数据给模板的功能。它定义了一个名为get_context_data()的方法,用于获取上下文数据。TemplateView类重写了这个方法,并在其中添加了一些默认的上下文数据,例如请求对象(request)和视图对象(view)。也可以在子类中重写这个方法,以传递额外的上下文数据给模板。(3)View:该类提供了最基本的处理请求的方法dispatch(),负责根据请求的HTTP方法分派到对应的处理方法。5.7.2基础类视图通过一个案例演示TemplateView类的基本使用,定义继承TemplateView类的类视图,并在类视图中指定渲染的模板名称以及要渲染的数据,具体步骤如下。(1)在chapter05项目的book应用的views.py文件中定义类视图AboutView,示例代码如下。示例演示fromdjango.views.genericimportTemplateViewclassAboutView(TemplateView):template_name='about.html'#指定渲染的模板名称
defget_context_data(self,**kwargs):#获取上下文数据
context=super().get_context_data(**kwargs)context['company']='MyCompany'returncontext5.7.2基础类视图(2)在templates文件夹中,创建about.html文件,并在该文件中显示类视图AboutView要渲染的数据,具体代码如下。示例演示<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body>{{company}}</body></html>5.7.2基础类视图(3)模板文件配置完成之后,还需要在项目的urls.py文件中为类视图定义URL模式,具体代码如下。示例演示path('about-view/',AboutView.as_view()),5.7.2基础类视图启动开发服务器,在浏览器地址栏中访问:8000/about-view/,此时页面会显示响应的内容,如图所示。2.RedirectViewRedirectView用于实现重定向功能,继承自View,具有View类提供的所有功能。它允许在应用程序中定义重定向规则,并将请求重定向到指定的URL。RedirectView类定义了一些独有的属性和方法,实现了重定向功能。下面对RedirectView类常用的特有属性和方法进行介绍。5.7.2基础类视图(1)属性permanent:用于设置重定向是否为永久重定向(HTTP状态码301),默认为False,表示不设置为永久重定向(HTTP状态码302)。url:重定向到的URL。可以是一个字符串形式的URL,也可以是一个可调用对象,如函数、方法等,返回一个URL字符串。如果没有指定url属性,则必须指定pattern_name属性。pattern_name:表示要重定向到的URL模式的名称,该名称是在URL配置中定义的。如果没有指定url属性,则必须指定pattern_name属性。query_string:表示是否将查询参数也包含在重定向的URL中,默认为False,表示不包含。如果设置为True,则表示要将查询参数也包含在重定向的URL中。5.7.2基础类视图(2)方法在RedirectView中,默认实现的get_redirect_url()方法会根据以下规则来生成重定向URL,该方法接收请求对象作为参数,并返回要重定向到的URL。get_redirect_url()方法默认使用类的url属性设置重定向的URL,若url属性未设置,get_redirect_url()方法尝试根据pattern_name属性设置的URL名称,以反向解析的方式匹配URL,如果没有设置url属性,也没有设置pattern_name属性,那么会抛出ImproperlyConfigured异常。5.7.2基础类视图通过一个案例演示RedirectView类的基本使用,定义继承RedirectView类的类视图,并在类视图中指定重定向URL地址、查询参数、是否永久重定向。在chapter05项目的book应用的views.py文件中定义类视图MyRedirectView,示例代码如下。示例演示5.7.2基础类视图fromdjango.views.genericimportRedirectViewclassMyRedirectView(RedirectView):url='/new-url/'
query_string=True
permanent=True#定义重定向后调用的类视图classSayHello(View):defget(self,request):returnHttpResponse('hello')在项目的urls.py文件中为类视图定义URL模式,具体代码如下。示例演示5.7.2基础类视图path('old-url/',views.MyRedirectView.as_view()),path('new-url/',views.SayHello.as_view()),启动开发服务器,在浏览器地址栏中访问:8000/old-url/,此时页面会重定向到:8000/new-url/,并显示响应数据,如图所示。通用视图5.85.8.1通用视图分类
先定一个小目标!熟悉通用视图分类,能够归纳各视图的作用通用视图是Django框架提供的一组预定义的类视图,用于简化开发者对常见功能的实现。通用视图优点在于提供了一致的接口和默认行为,使得开发者能够更快速地实现常见的功能需求,同时也提供了灵活的扩展机制,可以根据具体需求进行自定义和扩展。使用通用视图可以让开发者专注于业务逻辑的实现,减少重复代码的编写,提高开发效率。5.8.1通用视图分类5.8.1通用视图分类Django中提供了许多通用类视图,这些视图都可以通过django.views.generic模块导入。它们是基于常见的Web开发模式和最佳实践而设计的。这些类视图可以帮助我们更加高效地编写视图,避免重复代码,提高开发效率。分类内容说明基础视图ViewTemplateViewRedirectView基础视图是Django框架提供的一组最基本的视图函数,用于处理HTTP请求和生成HTTP响应。开发者可以通过编写基础视图函数来实现各种自定义的业务逻辑通用显示视图DetailViewListView通用显示视图是Django框架提供的一组用于展示数据的类视图,用于显示数据库中的对象或查询结果。这些类视图提供了一种简单而灵活的方式来处理数据的展示和呈现5.8.1通用视图分类分类内容说明通用编辑视图FormViewCreateViewUpdateViewDeleteView通用编辑视图是Django框架提供的一组用于处理常见CRUD(创建、读取、更新、删除)操作的类视图。这些类视图提供了一种简洁而灵活的方式来处理表单的展示、验证和保存,减少了编写重复代码的工作量通用日期视图ArchiveIndexViewYearArchiveViewMonthArchiveViewWeekArchiveViewDayArchiveViewTodayArchiveViewDateDetailView用于按日期对对象进行分组和展示,依次表示归档索引视图、按年份进行归档的视图、按月份进行归档的视图、按周进行归档的视图、按日期进行归档的视图、当天归档视图、日期详细
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 衬板工变革管理竞赛考核试卷含答案
- 井下电泵作业工岗前时间管理考核试卷含答案
- 胶合板工操作技能测试考核试卷含答案
- 无线电设备运维员安全文明知识考核试卷含答案
- 旅客登机桥操作员保密意识水平考核试卷含答案
- 护理安全环境优化
- 感染性疾病患儿的全球视野
- 莫西沙星氯化钠注射液在下呼吸道感染治疗中的药动学与药效学探究
- 药物联合生物反馈脑电:青少年焦虑抑郁障碍治疗新探
- 荧光定量RT - PCR:鼻咽癌外周血微转移检测的精准探索
- 短视频编辑合作协议书
- 2026年广东省深圳市34校联考中考二模化学试卷(含答案)
- 复式条形统计图
- 污水管网施工高温天气作业安全方案
- 统编版高中政治选择性必修三《逻辑与思维》综合题刷题练习题(含答案)
- (二模)南通市2026届高三第一次调研测试历史试卷(含答案)
- (二检)2026年宝鸡市高三高考模拟检测(二)历史试卷
- 餐饮业面试流程及常见问题
- 2026届甘肃省高三第一次模拟考试地理试题(含答案)
- 2026年NCCN卵巢癌包括输卵管癌及原发性腹膜癌临床实践指南第1版
- 2025广东中山大学附属第六医院公开招聘事业单位工作人员11人(第一批)笔试历年典型考题及考点剖析附带答案详解试卷2套
评论
0/150
提交评论