Django框架Django视图层

??????

一视图函数

视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请求信息以及返回响应信息的函数,所以研究视图函数只需熟练掌握两个对象即可:请求对象(HttpRequest)和响应对象(HttpResponse)   获取请求使用的方法(值为纯大写的字符串格式)。例如:"GET"、"POST"应该通过该属性的值来判断请求方法在视图函数中:ifrequest.method.=="GET":...ifrequest.method=="POST":...二.HttpRequest.GET   值为一个类似于字典的QueryDict对象,封装了GET请求的所有参数,可通过HttpRequest.GET.get(键)获取相对应的值在视图函数中:request.GET.get(name)三.HttpRequest.POST值为一个类似于字典的QueryDict对象,封装了POST请求所包含的表单数据,可通过HttpRequest.POST.get(键)获取相对应的值在视图函数中:request.POST.get(name)针对表单中checkbox类型的input标签、select标签提交的数据,键对应的值为多个,需要用:HttpRequest.POST.getlist("hobbies")获取存有多个值的列表,同理也有HttpRequest.GET.getlist("键")针对有多个值的的情况,也可以用HttpRequest.GET.get("键"),会获取列表中的最后一个值

案例:

urls.py

fromdjango.urlsimportre_pathfromapp01importviewsurlpatterns=[re_path(r^login/$,views.login),]

Views.py

fromdjango.shortcutsimportrender,HttpResponsedeflogin(request):ifrequest.method==GET:#当请求url为:   获取url地址的路径部分,只包含路径部分二.HttpRequest.get_full_path()   获取url地址的完整path,既包含路径又包含参数部分如果请求地址是   django将请求报文中的请求行、头部信息、内容主体封装成HttpRequest类中的属性。除了特殊说明的之外,其他均为只读的。"""一.HttpRequest.META 值为包含了HTTP协议的请求头数据的Python字典,字典中的key及期对应值的解释如下CONTENT_LENGTH——请求的正文的长度(是一个字符串)。CONTENT_TYPE——请求的正文的MIME类型。HTTP_ACCEPT——响应可接收的Content-Type。HTTP_ACCEPT_ENCODING——响应可接收的编码。HTTP_ACCEPT_LANGUAGE——响应可接收的语言。HTTP_HOST——客服端发送数据的目标主机与端口HTTP_REFERER——Referring页面。HTTP_USER_AGENT——客户端使用的软件版本信息QUERY_STRING——单个字符串形式的查询字符串(未解析过的形式)。REMOTE_ADDR——客户端的IP地址。REMOTE_HOST——客户端的主机名。REMOTE_USER——服务器认证后的用户。REQUEST_METHOD——一个字符串,例如"GET"或"POST"。SERVER_NAME——服务器的主机名。SERVER_PORT——服务器的端口(是一个字符串)。   从上面可以看到,除CONTENT_LENGTH和CONTENT_TYPE之外,HTTP协议的请求头数据转换为META的键时,都会1、将所有字母大写2、将单词的连接符替换为下划线3、加上前缀HTTP_。所以,一个叫做X-Bender的头部将转换成META中的HTTP_X_BENDER键。注意:下述常用属性暂且了解即可,待我们讲到专门的知识点时再专门详细讲解二.HttpRequest.COOKIES   一个标准的Python字典,包含所有的cookie。键和值都为字符串。三.HttpRequest.session 一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django启用会话的支持时才可用。11.HttpRequest.user(用户认证组件下使用)   一个AUTH_USER_MODEL类型的对象,表示当前登录的用户。2.HttpRequest.is_ajax()   如果请求是通过XMLHttpRequest发起的,则返回True,方法是检查HTTP_X_REQUESTED_WITH相应的首部是否是字符串XMLHttpRequest。   大部分现代的JavaScript库都会发送这个头部。如果你编写自己的XMLHttpRequest调用(在浏览器端),你必须手工设置这个值来让is_ajax()可以工作。   如果一个响应需要根据请求是否是通过AJAX发起的,并且你正在使用某种形式的缓存例如Django的cachemiddleware,你应该使用vary_on_headers(HTTP_X_REQUESTED_WITH)装饰你的视图以让响应能够正确地缓存。四.HttpRequest.encoding   一个字符串,表示提交的数据的编码方式(如果为None则表示使用DEFAULT_CHARSET的设置,默认为utf-8)。这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。接下来对属性的任何访问(例如从GET或POST中读取数据)将使用新的encoding值。如果你知道表单数据的编码不是DEFAULT_CHARSET,则使用它。五.HttpRequest.scheme表示请求方案的字符串(通常为   一个AUTH_USER_MODEL类型的对象,表示当前登录的用户。   如果用户当前没有登录,user将设置为django.contrib.auth.models.AnonymousUser的一个实例。你可以通过is_authenticated()区分它们,例如:ifrequest.user.is_authenticated():#Dosomethingforlogged-inusers.else:#Dosomethingforanonymoususers.HttpRequest.user只有当Django启用AuthenticationMiddleware中间件时才可用。匿名用户classmodels.AnonymousUserdjango.contrib.auth.models.AnonymousUser类实现了django.contrib.auth.models.User接口,但具有下面几个不同点:id永远为None。username永远为空字符串。get_username()永远返回空字符串。is_staff和is_superuser永远为False。is_active永远为False。groups和user_permissions永远为空。is_anonymous()返回True而不是False。is_authenticated()返回False而不是True。set_password()、check_password()、save()和delete()引发NotImplementedError。NewinDjango1.8:新增AnonymousUser.get_username()以更好地模拟django.contrib.auth.models.User。

插图:恶搞图03

###三响应对象

请求对象HttpRequest是由django为我们创建好的,直接使用即可,而响应对象则需要我们负责创建。我们编写的每个视图都应该返回一个HttpResponse对象,响应可以是一个网页的HTML内容,一个重定向,一个错误,一个XML文档,或者一张图片。用来返回响应对象的常用类如下

fromdjango.shortcutsimportHttpResponsefromdjango.shortcutsimportredirectfromdjango.shortcutsimportrenderfromdjango.   text/html:浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。   text/plain:意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。   image/jpeg:JPEG格式的图片   image/gif:GIF格式的图片   video/quicktime:Apple的QuickTime电影   application/vnd.ms-powerpoint:微软的powerpoint文件

依次增加字符串(了解)

response=HttpResponse()response.write("pHeresthetextoftheWebpage./p")response.write("pHeresanotherparagraph./p")

传递迭代器对象(了解)

#可以为HttpResponse传递可迭代对象,HttpRespone会将其依次迭代然后存储成字符串,类似文件或者其他带有close()方法的生成器对象,会自动调用close()关闭defindex(request):f=open(ra.txt,mode=r,encoding=utf-8)#a.txt文件内容为response=HttpResponse(f)print(response.content)#打印内容为:b#f.read()#如果执行,则会抛出异常,说明文件已经关闭了,无法读取returnresponse

设置或删除响应头信息

response=HttpResponse()response[Content-Type]=text/html;charset=UTF-8response[X-Frame-Options]=SAMEORIGINdelresponse[Content-Type]

属性

HttpResponse.status_code:响应的状态码HttpResponse.charset:响应内容的编码encode格式HttpResponse.content:响应内容

字符串编码:

#编码设定原则:编码格式与解码格式保持一致response=HttpResponse(charset=gbk,content_type=text/html;charset=gbk)#参数charset=gbk指定响应体内容response.content的编码格式#参数content_type=text/html;charset=gbk是设置响应头,用于告诉浏览器响应体内容response.content应该采用何种解码格式,注意:设置时必须加上内容的类型,如text/html#强调:#如果在实例化HttpResponse时没有指定charset=gbk,将会采用与content_type中设定的解码格式一样的编码,这样统一起来就不会出现乱码问题#如果也没有指定content_type,那么django默认会读取配置文件中的配置settings.py.DEFAULT_CHARSET来作为默认的编码与解码格式defindex(request):response=HttpResponse(charset=gbk,content_type=text/html;charset=gbk)response.charset=gbk#实例化后,可以对该属性重新赋值,只要是在write内容前,就会以最新赋值的编码格式为准response.write("pHelloegon美男子/p")response.write("pHello林sb/p")#如果实例化处未指定响应头Content-Type,也可以在此处设置,在一处就可以了,无需重复设置response[Content-Type]=text/html;charset=gbk#response[Content-Type]=text/html;charset=UTF-8print(response.charset)print(response.content)returnresponse

####3.2、render

defrender(request,template_name,context=None,content_type=None,status=None,using=None):"""ReturnaHttpResponsewhosecontentisfilledwiththeresultofcallingdjango.template.loader.render_to_string()withthepassedarguments."""content=loader.render_to_string(template_name,context,request,using=using)returnHttpResponse(content,content_type,status)参数:1、request:用于生成响应的请求对象,固定必须传入的第一个参数2、template_name:要使用的模板的完整名称,必须传入,render默认会去templates目录下查找模板文件3、context:可选参数,可以传入一个字典用来替换模块文件中的变量,默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。4、content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE设置的值。默认为text/html5、status:响应的状态码。默认为。6、useing:用于加载模板的模板引擎的名称。

综上,render的功能可以总结为:根据给定字典渲染模板文件,并返回一个渲染后的HttpResponse对象。简单示例如下

urls.py新增路由

fromdjango.urlsimportre_pathfromapp01importviewsurlpatterns=[re_path(r^$,views.index),]

views.py内容如下

fromdjango.shortcutsimportrenderdefindex(request):returnrender(request,index.html,{name:egon,tag:dsb})#上述代码等同于fromdjango.shortcutsimportrenderfromdjango.templateimportloaderdefindex(request):t=loader.get_template(index.html)dic={name:egon,tag:dsb}returnHttpResponse(t.render(dic,request))

templates目录下新增文件index.html,内容如下

!DOCTYPEhtmlhtmllang="en"headmetacharset="UTF-8"titleTitle/title/headbodyp{{name}}/pp{{tag}}/p/body/html

测试

#启动django,在浏览器中访问url地址   表示永久重定向,旧地址A的资源已经被永久地移除了,即这个资源不可访问了。   表示临时重定向,旧地址A的资源还在,即这个资源仍然可以访问。A页面临时重定向到B页面,那搜索引擎收录的就是A页面。A页面永久重定向到B页面,那搜索引擎收录的就是B页面。从SEO层面考虑,要好于二、重定向原因:1、网站调整(如改变网页目录结构);2、网页被移到一个新地址;3、网页扩展名改变(如应用需要把.php改成.Html或.shtml)。这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

插图:恶搞图04

####3.4、JsonResponse

向前端返回一个json格式字符串的两种方式

方式一:

importjsondefmy_view(request):data=[egon,kevin]returnHttpResponse(json.dumps(data))

方式二:

fromdjango.



转载请注明地址:http://www.sanbaicaoasb.com/scls/7530.html
  • 上一篇文章:
  • 下一篇文章:
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章