1、cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

2、cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。

我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

3、总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。

4、另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架

 

前几节的介绍中我们已经有能力制作一个登陆页面,在验证了用户名和密码的正确性后跳转到后台的页面。但是测试后也发现,如果绕过登陆页面。直接输入后台的url地址也可以直接访问的。这个显然是不合理的。其实我们缺失的就是cookie和session配合的验证。有了这个验证过程,我们就可以实现和其他网站一样必须登录才能进入后台页面了。

      先说一下这种认证的机制。每当我们使用一款浏览器访问一个登陆页面的时候,一旦我们通过了认证。服务器端就会发送一组随机唯一的字符串(假设是123abc)到浏览器端,这个被存储在浏览端的东西就叫cookie。而服务器端也会自己存储一下用户当前的状态,比如login=true,username=hahaha之类的用户信息。但是这种存储是以字典形式存储的,字典的唯一key就是刚才发给用户的唯一的cookie值。那么如果在服务器端查看session信息的话,理论上就会看到如下样子的字典

{'123abc':{'login':true,'username:hahaha'}}

因为每个cookie都是唯一的,所以我们在电脑上换个浏览器再登陆同一个网站也需要再次验证。那么为什么说我们只是理论上看到这样子的字典呢?因为处于安全性的考虑,其实对于上面那个大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服务器端也是一样被加密的。所以我们服务器上就算打开session信息看到的也是类似与以下样子的东西

{'123abc':dasdasdasd1231231da1231231}

django的session默认是存储在数据库里的

下面我们再来最后的总结一下cookie和session的知识

一、操作Cookie

  获取cookie:request.COOKIES[key]

  设置cookie:response.set_cookie(key,value)

由于cookie保存在客户端的电脑上,所以,jquery也可以操作cookie。

<script src='http://830909.blog.51cto.com/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

二、操作Session(session默认在服务器端保存15天)

  获取session:request.session[key]

  设置session:reqeust.session[key] = value

  删除session:del request.session[key]    

(这个删除其实就是把数据库的session_data更新为一个其他的值了,并没有立即删除)

 

request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

 2.分页

  1.手动分页

 1 ************************视图函数****************
 2 uselist = []
 3 for i in range(1,100):
 4     use_data ={"username":"root"+str(i),"age":i}
 5     uselist.append(use_data)
 6 
 7 def orginal_index(request):
 8     per_page_num = 10   #定义每页显示的记录条数
 9     current_page = request.GET.get("p")  #获取用户指定页码
10     try:             #对用户输入的指定页码做异常处理,如果小于等于1或者类型错误都让它跳转至第一页,
11         current_page = int(current_page)
12         if current_page<=1:
13             current_page = 1
14     except Exception as e:
15         current_page = 1
16     statr_page = (current_page-1)*per_page_num   #每页的开始条数下标
17     end_page = (current_page)*per_page_num      #每页的结束条数下标
18     data = uselist[statr_page:end_page]       #切片
19     pre_page = current_page-1  #上一页页码
20     next_page = current_page+1    #下一页页码
21     x,y = divmod(len(uselist),per_page_num)  #对分页的总数做个判断
22     if y > 0:
23         x = x+1
24         if next_page>x:   #如果下一页的页码大于总页码让它跳转至最后一页
25             next_page = x
26     return render(request,"orginal_index.html",{"userlist":data,"previous_page":pre_page,"next_page":next_page})
27 
28 
29 
30 *********************html******************************
31 <!DOCTYPE html>
32 <html lang="en">
33 <head>
34     <meta charset="UTF-8">
35     <title>Title</title>
36 </head>
37 <body>
38 
39 <ul>
40     {% for i in userlist%}
41         <li>{{ i.username }}-{{ i.age }}</li>
42     {% endfor %}
43     <p><a href="/orginal_index?p={{ previous_page }}">上一页</a>
44         <a href="/orginal_index?p={{ next_page }}">下一页</a></p>
45 </ul>
46 
47 </body>
48 </html>
View Code

相关文章:

  • 2021-11-16
  • 2022-12-23
  • 2021-12-23
  • 2022-01-23
  • 2021-04-29
猜你喜欢
  • 2021-03-27
  • 2022-01-19
  • 2021-06-27
  • 2022-12-23
  • 2021-11-19
  • 2021-10-03
  • 2021-06-03
相关资源
相似解决方案