Django之cookie 和 session

一、

1、cookie的由来!!!

    由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。

2、什么是cookie?

    Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组键值对,下次访问浏览器时会自动携带这些键值对,以便服务器提取信息。简单来说就是,Cookie会在你访问服务器时给你一个标记,下一次你再来访问只要携带这个标记,就能够访问了。所以他只认标记,不认用户。用的最普遍的就是做登录系统。

3、Cookie的工作原理。

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

4、查看cookie

    Name 和 Value就是键值对

二、Djangoz中操作Cookie

  1、获取cookie   

1request.COOKIES['key'] 2request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

  参数:

    default:默认值

    salt:加密盐

    max_age:生命周期

  2、设置cookie

1ret = render (request,'html文件') 2ret.set_cookie('key','value') 3return ret

    通过set_cookie,这样就对ret 设置了cookie。

   参数:

      key:键

      value:值

      max_age=None,超时时间

      expires = None,超时时间,用于IE浏览器的

      path='/':Cookie生效的路径,/表示根路径,他比较特殊。根路径的cookie可以被任何url页面访问。

      domain = None,cookie生效的域名

      secure= False:https传输

      httponly = False:只能http协议传输,无法被JavaScript获取。(不是绝对的,底层抓包可以获取到,也可以被覆盖)

  3、删除cookie

1def logout(request): 2 rep = redirect("/login/") 3 rep.delete_cookie("key") # 删除用户浏览器上之前设置的cookie 4 return rep

  4、Cookie版登录校验的示例

1from django.shortcuts import render, redirect, HttpResponse 2 3# 这是一个装饰器,封装了一个匹配cookie的功能 4def login_required(fn): 5 def inner(request, *args, **kwargs): 6 if not request.COOKIES.get('is_login') == '1': # 获取cookie的键'is_login',判断它的值是不是1,如果不是就获通过path_info获取到域名之后的路径next 7 next = request.path_info # cookie匹配不上,就跳转到登录界面,不过这个登录界面拼接了路径。/login/?next={}'.format(next), 8 # 拼接的后缀就是为了能够确保,从哪个页面失败人后进入的登录界面,登陆成功后跳回对应的页面 9 return redirect('/login/?next={}'.format(next)) 10 ret = fn(request, *args, **kwargs) # 如果匹配成功,就跳转到被装饰得页面。 11 12 return ret 13 14 return inner 15 16# 这是一个登录函数 17def login(request): 18 if request.method == 'POST': # 判断请求方法,是POST方法,执行下面的操作 19 user = request.POST.get('user') 20 pwd = request.POST.get('pwd') 21 if user == 'alex' and pwd == 'alexdsb': # 如果用户名和密码匹配成功了 22 next = request.GET.get('next') # 通过GET方法,获取next。 23 24 if next: # 如果next有值,说明不是直接进的登录界面,而是访问其他路径,没有成功,通过装饰器拼接了next跳转过来的 25 ret = redirect(next) # next有值,就跳到next这个路径下 26 else: # 如果next没有值,说明是直接进入的登录界面,登陆成功后,直接跳转到'/index/'界面 27 ret = redirect('/index/') 28 29 ret.set_cookie('is_login', '1', max_age=5) # 设置cookie值cookie('键','值','最大死亡时间'30 return ret 31 32 return render(request, 'login.html') 33 34 35@login_required 36def home(request): # 被装饰器装饰的函数, 37 return HttpResponse('这是home页面') 38 39 40@login_required 41def index(request): 42 return render(request, 'index.html') 43 44# 注销函数 45def logout(request): 46 ret = redirect('/login/') 47 48 ret.delete_cookie('is_login') # 删除cookie之后,跳转回登录页面 49 50 return ret

三、Session

  1、Session的由来

    由于Cookie是存在浏览器上的,所以很不安全,随时可能被拦截和窃取,同时Cookie最大支持4096个字节,多了就没法存储了。这时,为了解决这个问题,提高cookie的安全性,有了Session。它能够支持更多的字节,并且把保存在服务器上,有较高的安全性。  

     由于HTTP是无状态的,所以服务器也不知道是谁再访问,所以就需要Cookie做桥接。给每个客户端的Cookie分配一个唯一的ID,这样用户在访问时,通过Cookie,服务器就知道来的认识谁。

   2、Django中Session的用法

    1、

1# 获取、设置、删除Session中数据 2request.session['k1'] 3request.session.get('k1',None) 4request.session['k1'] = 123 5request.session.setdefault('k1',123) # 存在则不设置 6del request.session['k1'] 7 8 9# 所有 键、值、键值对 10request.session.keys() 11request.session.values() 12request.session.items() 13request.session.iterkeys() 14request.session.itervalues() 15request.session.iteritems() 16 17# 会话session的key 18request.session.session_key 19 20# 将所有Session失效日期小于当前日期的数据删除 21request.session.clear_expired() 22 23# 检查会话session的key在数据库中是否存在 24request.session.exists("session_key") 25 26# 删除当前会话的所有Session数据 27request.session.delete() 28   29# 删除当前的会话数据并删除会话的Cookie。 30request.session.flush() 31 这用于确保前面的会话数据不可以再次被用户的浏览器访问 32 例如,django.contrib.auth.logout() 函数中就会调用它。 33 34# 设置会话Session和Cookie的超时时间 35request.session.set_expiry(value) 36 * 如果value是个整数,session会在些秒数后失效。 37 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 38 * 如果value是0,用户关闭浏览器session就会失效。 39 * 如果value是None,session会依赖全局session失效策略。

  3、Session流程解析

  3、Session版登录验证

1from functools import wraps 2 3 4def check_login(func): 5 @wraps(func) 6 def inner(request, *args, **kwargs): 7 next_url = request.get_full_path() 8 if request.session.get("user"): 9 return func(request, *args, **kwargs) 10 else: 11 return redirect("/login/?next={}".format(next_url)) 12 return inner 13 14 15def login(request): 16 if request.method == "POST": 17 user = request.POST.get("user") 18 pwd = request.POST.get("pwd") 19 20 if user == "alex" and pwd == "alex1234": 21 # 设置session 22 request.session["user"] = user 23 # 获取跳到登陆页面之前的URL 24 next_url = request.GET.get("next") 25 # 如果有,就跳转回登陆之前的URL 26 if next_url: 27 return redirect(next_url) 28 # 否则默认跳转到index页面 29 else: 30 return redirect("/index/") 31 return render(request, "login.html") 32 33 34@check_login 35def logout(request): 36 # 删除所有当前请求相关的session 37 request.session.delete() 38 return redirect("/login/") 39 40 41@check_login 42def index(request): 43 current_user = request.session.get("user", None) 44 return render(request, "index.html", {"user": current_user}) 45 46Session版登录验证

Session 版登录验证

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )