视图类

功能

图1

简单回顾,视图功能,接收请求,进行处理,和M.T交互,返回应答

我开门可以返回HttpResponse页面,也可以返回HttpResponseResdirect


使用

图2

首先我们要定义视图函数,接收request参数,

然后配置urls,将项目的urls配置包含我们的应用,将应用的urls配置指向我们的视图函数,配置项存在于列表urlpatterns中,每个项目都是url函数


我们将新项目配置好后,比如我们让index返回个首页,具体就不说了,我们如果按下图输入url,并不会404,是因为请求资源是端口号/后面开始到?前,问号后是我们传入的参数

图3

所以我们记住每次参与匹配的只有我们请求资源的部分,即如上图的index

图4

如果资源匹配不成功,我们会看到上图中在项目的urlpatterns里匹配了2个url项,但是都没匹配,于是就出现404,当然这是调试的时候我们这么显示,如果是别人访问你的页面。能给人显示么,明显不能啊!这不是告诉人家我们调整哪些路径就会ok了么

我们还能看出DEBUG=True,一旦我们完成了调试,我们一定要给其设置为False  !!!!!

图5

我们如果要发布了,就需要给项目的settings.py里找到DEBUG = True 将其修改为False

图6

我们只设置DEBUG = False还不够

日志会提醒我们要设置ALLOWED_HOSTS,

我们继续在setting.py下面设置ALLOWED_HOSTS = ['*']即可以访问的主机不限

图7

我们继续访问不存在资源就会看到如上的页面

如果我们想自己设置这个页面,可以在templates下面创建一个404.html 如下

图8

如果用户访问不存在资源,会将request_path传给这个页面,我们可以在页面上显示,而这个html我们不用给其配置视图也不用管urls,django会自动给我们显示,如下图

图9

同理我们如果服务端代码出现问题,如果我们设置非DEBUG,django会给我们一个500页面

图10

我们也可以自己设置这个页面,在目标文件夹下创建500.html,如下

图11

我们网站经常会出现的就是以上2个错误,如果是404,可能是没有资源,也可能就是我们配置错了,

如果是500一般是视图调用代码出现问题

我们如果是开发模式,还是建议给设置DEBUG=True,ALLOWED_HOSTS = []

这样django会直接在页面上给我们很多错误提示信息,

图12

如图中尝试将字符串和数字拼接(这里是人为故意设置)


urls参数捕获

我们之前说了如果我们捕获参数,url(r'args(\d+)',views.showargs),正则部分会把请求资源的数字部分当做参数传给视图函数,所以视图函数除了request参数,也一定要把这部分传入

我们还可以使用正则表达式起组名的方式

图13

我们设置完组名,给函数传递参数也必须用这个组名,否则会报错

图14

登录案例

我们之前讲了视图函数里有个必须写的参数request,其实是HttpRequest对象,里面有一些属性,都是django为我们封装好的,我们这里通过一个案例学习下

我们做一个登录的案例,当然页面得有用户密码,我们写login.html,要设置表单和输入框,方法我们讲过get和post,get提交数据会显示在url中,我们使用post,数据在请求体中,然后记得设置个提交按钮

图15

页面提交我们设置给login_check

图16

我们给urls配置login,但是视图函数先空着写个返回login.html渲染

图17

我们在网页访问login,填写信息后,会发现404,当然我们没写login_check,我们可以看到审查元素里有我们提到的表单信息

图18

我们现在写视图函数,我们接收的request对象,分别有GET和POST属性,其中GET保留的是GET接收的参数,POST是POST接收的,我们尝试打印下这个POST类型(先告知返回的类型是QueryDict请求字典),我们记得把urls里也配置好,

我们网页请求login输入跳转到login_check,会发现出现403,如下图

图19
图20

我们后面会介绍为什么会403,我们这里为了不看见403,要给项目settings.py的一行注释掉,如上图

图21

后台日志可以看到类型为django.http.request.QueryDict类型,所以request的GET和POST都是QueryDict类型,为了看怎么使用,我们去shell里运行下

图22

我们导入QueryDict,传参数可以使用条件&,然后我们就可以使用字典一样访问元素,有[]或者get,但是这里get如果访问一个不存在的键没有结果,而[]会报错,当然get方法也可以像字典一样传入默认值,这里需要注意的是会k,v都被设置成了字符串

图23

QueryDict允许一键多值,比如我们[]或者get访问上图'a'会得到最后一个值,想查看多值,可以用getlist(key)获得多值列表

图24

所以我们就可以通过使用键值来获得账号密码,键必须和我们之前input控件的name一致

然后下一步就是根据用户名密码在数据库里进行校验,根据情况返回页面

图25

我们request还有其他属性,如上图,我们已经知道了GET,POST,其他解释如图


视图Ajax请求

我们之前设置的网页都是在一个页面的基础上重新刷新页面,如果网页的资源比较多,那么用户的体验会是非常差的,就涉及到了ajax请求(ajax在javascript里是异步的意思)(这里我们js几乎没看,然后变成跳转看js去了,日了)type默认是get方式,但是get方式能保留的数据有限

图26

我们下面做一个ajax例子

新建一个ajax页面,然后配置下设置,我们在项目下新建static文件夹,然后在settings.py里给创建列表STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')],然后我们创建的所有静态文件都可以放到里面,如css,js

图27

视频中给文件夹放了个js文件,如下图script的src(然而我没有!可以百度到下载或者自建百度赋值粘贴),然后下面写了js代码,定义ajax请求,绑定ajax的click事件,里面url设置为请求ajax_handle(一会儿要urls和视图函数配置),类型用json,如果成功执行函数,函数处理部分先不写

图28

我们先在urls里写上2个页面索引,一个是text_ajax资源的索引,另一个是我们ajax请求的ajax_handle索引

图29

在views.py里,我们加上2个对应的视图函数,一个是用户最最开始访问的页面,当然就是text_ajax页面,我终于转过弯,另一个就是我们ajax请求的页面,因为要返回json数据,我们从django.http import JsonResponse即可,里面传入字典格式,我们师范的传入个简单字典,如下

图30


图31

我们刚才给ajax的success函数还没有处理,我们这里就做个alert弹窗,把data(这个data就是接收到的数据字典,我们alert一下res键的值)

图32

这里配置静态资源的作用是,我们访问Js文件,但这个文件不需要经过视图函数处理,而是作为静态资源给html,否则会404(如果中间出现ajax错误,我们就要用审查元素查看错误)

图33

下面谈下登录页面,比如我们的登录,如果点击登录,默认会再请求一次网页,如果页面资源比较多,用户体验就会很差

图34

我们对之前的代码再体验下异步,我们在函数里分别alert3个1,2,3,我们点击按钮后,会发现数字并不一定是1,2,3的顺序,比如上面的可能是1,3,2(1,3顺序不会变)但是弹3不会等里面是否success

图35

我们的ajax还有个参数async异步,默认是true(js不是Python的True),我们设置false就能实现123的顺序执行


ajax登录案例

我们之前介绍了表单post提交,我们这回不通过表单,利用ajax,如果登陆成功提示,用户名密码,不成功也提示

我们新建一个ajax_login.html

图36

我们设置按钮,2个input,设置对应的id,'btnLogin','username','password',使用jquery的通过id获得值的方法$(id字符串).val()将数据作为下面ajax函数的参数,ajax里方法也有post和get,我们使用post,data为我们发送的数据,返回要求是json格式数据

图37

我们还是用res的0,1来判断是否登陆成功,如果是0,我们默认设置了div为display:none,我们就调用其show().html(文本字符串)就实现div的显示同时显示我们设置的文本,否则我们就让其跳转,注意跳转一定要写在这里,后面函数会说明(ajax本身是后台请求,通过其请求的页面不会被展示到页面),这里用locdation.href赋值我们回到index页面

图38

然后我们编写视图函数,因为是POST方法,我们还是可以使用request.POST.get键值获得属性,我们这里设置了个判断,根据情况返回json格式结果,视图函数写完进行urls配置

图39

配置完运行,实现功能,(中间我查了好久,才发现光顾着看检查函数,忘了写login_ajax基本函数,还有403之前只顾做笔记没有给settings.py注释,这回见识到了,还有href我老写成herf,,MD!!)

最后我们说下之前说的为什么正确,不能再视图函数里用重定向,如果我们使用,因为是ajax请求,是在后台请求index页面,却不是浏览器请求,我们就还在登录界面挂着


状态保持

图40

然而有时候我们就是需要保持登录状态,比如刷新页面再登录,还有点击记住用户名等等

http用于记住用户信息有2种方式,cookie和session

Cookie

形象形容,我去找老板买豆浆,老板给单子设置cookie,然后找老板拿豆浆,把单子给老板,这里我就是浏览器的角色,老板是服务器,单子就是cookie

图41

我们上图来讲解cookie,当我们第一次用浏览器访问服务器时,服务器对用户请求处理,同时设置其cookie信息,然后将其发送给浏览器,我们浏览器下次访问就会带着cookie访问服务器

图42

cookie存储在浏览器端的小段文本,以键值对存储,有时间限制,不指定,默认是关闭

图43

我们设置cookie使用HttpResponse对象或者继承他的方法,使用set_cookie函数

浏览器发给服务器的cookie,我们可以通过视图函数request.COOKIES获得

为了实现cookie案例,我们先写2个对应的视图函数如下

图44

我们写2个函数,名称必须固定,set_cookie函数,我们创建一个HttpResponse实例,我们给其调用其set_cookie方法,我们传入2个参数,键设置为'num',值1,然后返回这个对象

get_cookie函数,我们这里就将接收到的cookie的num值获取后先进行返回

视图函数写好后进行配置urls

图45

配置好,我们就可以访问set_cookie

图46

我们可以看到我们访问的时候,收到了浏览器的响应cookies num,1

图47

我们还可以看到响应头里,有Set_Cookie键,里面是我们的信息,这里其实是通过我们的set_cookie函数,通过返回的HttpResponse对象,将其变成响应头部分

图48

上面我们保留了cookie,这次我们访问get_cookie,可以看到页面给我们返回1,在审查元素,可以看到Cookie里得到num=1

图49

我们在cookies里也会看到request cookies num 1因为我们是带着cookie请求的

我们说过HttpResponse子类也可以,所以我们也可以是HttpRedirect,JsonResponse

图50

cookie是有时间限制的的,比如我们关闭浏览器,再尝试访问get_cookie,就会报keyerror,我们也会看到cookie里没有了num项

图51

其实set_cookie还可以保持时间,可以使用max_age参数或者expires参数,max_age是秒数,我们设置2周可以用前面的,如果是后者,需要datetime导入timedelta,比较麻烦,正常是2个参数写一个即可,推荐前者

图52

我们设置时间后,访问set_cookie,可以看到cookies里多了时间14天

图53

同样,headers里Set_Cookie里也能看到有效时间等,当然我们关了浏览器,也还能访问get_cookie了

图54

cookie可以不止一个键值对,我们可以设置多个cookie如上

cookie基于域名是安全的,我们访问百度,浏览器只会把百度的cookie发给百度,访问淘宝只会发淘宝的cookie


Cookie案例 让Cookie记住用户名

我们基于之前的登录案例,我们下面加一个checkbox对是否勾选提示

图55

我们现在函数里打印下这个remember的value看看是什么

图56

可以看到未勾选后台打印了个none

图57

当点击勾选打印on,所以我们可以判断是on记住用户名,设置cookie,否则不设置

图58

我们在视图函数里增加判断如果用户密码正确,而且选了记住用户名on,我们返回redirect对象(redirect返回的是HttpResponse对象,可以set_cookie),这里我们给cookie传入username,

图59

当我们点击勾选,且正确登录,我们可以看到跳转页面里返回响应cookies的用户名

图60

然后我们为了下次登录也能记住用户名,我们就在请求login资源的时候,利用COOKIES数据,但是第一次可能没有COOKIE,我们需要判断,在就返回值否则返回空字符串,同时,将字典作为渲染render的参数返回,

图61

我们就同时修改login.html将input用户名的地方value设置为我们传入的username参数

图62

这样我们再刷新参数就可以看到用户名显示在上面,

中间我半天出不来,我才发现表单提交是通过name而不是id,我开始把字符串都给id了,蠢爆!!!


Session

之前说了cookie,这回讲session,比如我们办健身卡,老板给你个卡号,以后并卡号就可以健身

图63

如上图,当我们访问网站时,服务器就会存储用户信息到表django_session中,然后这个表有session_key,session_data字段,数据就在session_data中,session_key是服务端设置的能唯一识别你的信息的标识码,服务器就将这个标识码sessionid作为cookie内容和响应一起发回浏览器,让浏览器保存

浏览器再次访问服务器就会根据这个sessionid获取对应的信息,信息再request.session中

图64

我们的session是存储在服务器端的,用键值对存储,依赖cookie,有过期时间,默认2周

图65

我们设置获取都是通估计request.session,用键名访问,具体怎么实现的django框架帮你搞定

简单session读取设置案例

图66

我们给视图函数添加2个函数,一个是设置session,我们直接给session的按键值对赋值,然后返回个字符串页面,设置session,另一个是获取session,我们根据session的内容,返回获取到的内容,这里注意age是int要拼接要变成str。然后如下配置urls

图67

配置完,就可以演示session配置了,我们之前说了session存储在django的django_session表中,我们新开终端进入mysql,切换到我们的数据库,可以看到表里有个我们说的,得到验证,

图68

我们可以select * from django_session;查看内容,可以看到已经放了一堆乱七八糟的内容,如下,我们可以把之前的session给删掉delete from django_session;此时表格记录为0

图69

我们访问set_session,我们可以看到django给我们返回了响应cookie,里面的键名sessionid,值是一堆很长的

图70

我们可以通过查看表格,发现django_session表多了一条记录,其中session_key的第一条和上图的sessionid值一样,当然我们还能看到session_data值,也是很长一串,这部分是经过base64加密的

图71

我们可以百度一个base64解码的网站,复制值粘贴过去,可以看到是我们给session添加的信息

图72

我们同样可以登录getsession可以看到我们请求时带着sessionid发过去的,同时我们的页面也展示了session信息,具体怎么拿的,这部分是django默认封装好了,我们只需要知道通过request.session来取就行

图73

session对象的方法

图74

对于读取设置,1,2条不用说了。第3条,clear是只给我们session传入值的部分去掉,记录还在,

图75

我们视图函数写个清除函数,urls里配置,然后我们先访问clear_session,然后可以看到表格里数据==后面没了,

图76

我们解码也会发现后边变成空字典

图77

request.session.flush()是直接清除session记录,表格整行

del request.session[键名]删除记录data中的某项数据

图78

request.session.set_expiry(value)是设置超时时间,value不写,默认2周,其他是秒数单位的整数,0即关闭就session过期


案例,记住用户登录状态

如果用户登录过,我们就记住用户登录状态,下次直接登录

图79

我们给login_check视图函数中给session添加islogin属性,如果账号密码对上,就设置为True

图80

我们修改login函数,对session对象的islogin属性判断,我们可以使用session对象的has_key(键名字符串)判断

如果已登录,就返回Index页面,否则就将之前写登录的部分写到else里,

这样我们登录过旧能实现直接转到index页面,

图81

cookie和session应用场景,cookie记住用户名,安全性要求不高,session涉及到安全比较高的数据,保存到服务端

你可能感兴趣的:(视图类)