Django 之 cookie和session

Stella981
• 阅读 597

1、Cookie的由来

因为HTTP协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,也不会受前后请求响应情况直接影响。简而言之,对服务器来说,每一次请求都是全新的。

状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态就是这些数据不会被保存;但是我们又需要保存会话中产生的数据,也就是报讯状态。因此Cookie就来了。

2、什么是Cookie

Cookie具体指一小段信息,它是服务器发送出来存储在浏览器上的一组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

3、Cookie的原理

由服务器产生内容,浏览器收到请求后保存在本地,当浏览器再次访问的时候,浏览器会自动带上cookie,这样服务器就能通过Cookie的内容来验证身份。

4、Cookie的特性

1、服务器让浏览器进行设置的

2、保存在浏览器本地,浏览器也可以不保存

3、下次访问自动携带cookie保存的信息

5、Cookie的用途

1、登陆

2、保存用户的浏览习惯

3、投票

6、查看Cookie

使用浏览器打开开发者工具

Django  之  cookie和session

7、在Django中操作Cookie

ret = redirect('/home/')
​
ret.set_cookie(key,value,...) # 普通的cookie
 #ret = set_cookie('is_login','1')  
    
ret.set.signed_cookie(key,value,salt='加密盐',...) # 加密的cookie
# ret = set_signed_cookie('is_login','1','miyao') 

参数:

  • key,键

  • value=‘’,值

  • max_age=None,超时时间

  • expires=None,超时时间(IE requires expires,so set it if hasn't been already)

  • path=‘/’,Cookie生效的路径。/表示根路径,特殊的:根路径的页面可以被任何url的页面访问

  • domain=None,Cookie生效的域名

  • secure=False,https传输

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

request.COOKIE   # 普通的cookie
request.get_signed_cookie('is_login',salt='miyao',default='') # 加密的cookie

get_signed_cookie 方法的参数:

  • default:默认值

  • salt:加密盐

  • max_age:后台控制过期时间

3、删除
ret = redirect('/login/')
ret.delete_cookie('is_login')
​
del request.COOKIES[key]

cookie版的登陆校验

Django  之  cookie和session Django  之  cookie和session

def login_required(func):
    def inner(request,*args, **kwargs):
        # is_login = request.COOKIES.get('is_login')
        is_login = request.get_signed_cookie('is_login',salt='miyao',default='')
        if is_login == '1':
            ret = func(request, *args, **kwargs)
        else:
            # 获取当前访问的页面,拼接到login地址后
            return_url = request.path_info
            ret = redirect('/login/?return_url={}'.format(return_url))
        return ret
    return inner
​
​
class Login(View):
​
    def get(self,request):
        return render(request,'login.html')
​
    def post(self,request):
​
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        path_info = request.path_info
        print(path_info)
        if user == 'hu' and pwd == '1234':
            return_url = request.GET.get('return_url')
            # 有地址,跳转到url,没有跳转到home
            if return_url:
                ret=redirect(return_url)
            else:
                ret=redirect(reverse('home'))
            # ret.set_cookie('is_login','1')
            ret.set_signed_cookie('is_login','1','miyao')
            return ret
​
        else:
            return render(request, 'login.html',{'error':'用户名或者密码错误,整啥呢'})
​
​
@login_required
def home(request):
    return render(request, 'home.html')

登陆校验

二、session

1、session的由来

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

Cookie在其中就起到桥接作用。我们可以给每个客户端的Cookie分配一个我i一的id,这样用户在访问的时候,通过Cookie,服务器就知道来的人是谁,然后我么再根据不同的Cookieid,在服务器上保存一段时间的私密资料,如账号密码等。

总而言之,Cookie弥补HTTP无状态的不足,让服务器知道来者是谁,但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的Session里保存私密的信息以及超过4096字节的文本。

另外,上述的Cookie和Session是共通的东西,不限于语言和框架。

什么是Session

保存在服务器上的一组组键值对,必须依赖于Cookie

为什么要使用Session

1、cookie保存在浏览器本地不安全,

2、cookie的大小收到限制

Django中操作session

1、设置

request.session[key] = value
request.session.setdefault('k1',123)  # 若存在,则不设置

2、获取

request.session[key]
request.session.get(key)
request.session.get(key,None)

3、删除

del request.session[key]
request.session.clear_expired()  #清除已过期的数据
request.session.delete()  # 删除所有的session数据, 不删除cookie
request.session.flush()   # 删除所有的session数据。删除cookie    django.contrib.auth.logout() 函数中会调用它

所有的键,值,键值对

request.session.keys()
request.session.values()
request.session.items()

会话session的key

request.session.session_key

检查所有session的key在数据库中是否存在

request.session.exists("session_key")

设置会话session和cookie的超时时间

request.session.set.expiry(value)
  • 如果value是整数。session会在这些秒数后失效

  • 如果value是个datatime或timedelta,session会在这个时间后失效

  • 如果value是0,用户关闭浏览器session就会失效

  • 如果value是None。session会依赖全局session失效策略

查看session的一些方法

from django.conf import global_setting
session的流程解析

Django  之  cookie和session

session版的登陆校验

Django  之  cookie和session Django  之  cookie和session

from django.shortcuts import render,redirect,reverse,HttpResponse
from django.views import View

def login_required(func):
    def inner(request,*args, **kwargs):
        # 获取session的值,
        is_login = request.session.get('is_login')
        print(is_login)
        if is_login == '1':
            ret = func(request, *args, **kwargs)
        else:
            # 获取当前访问的页面,拼接到login地址后
            return_url = request.path_info
            ret = redirect('/login/?return_url={}'.format(return_url))
        return ret
    return inner

class Login(View):

    def get(self,request):
        return render(request,'login.html')

    def post(self,request):

        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        path_info = request.path_info
        print(path_info)
        if user == 'hu' and pwd == '1234':
            return_url = request.GET.get('return_url')
            # 有地址,跳转到url,没有跳转到home
            if return_url:
                ret=redirect(return_url)
            else:
                ret=redirect(reverse('home'))
            # 设置session的值。
            request.session['is_login'] = '1'
            return ret

        else:
            return render(request, 'login.html',{'error':'用户名或者密码错误,整啥呢'})
        
@login_required
def home(request):
    return render(request, 'home.html')

@login_required
def index(request):
    return render(request, 'index.html')

def loginout(request):
    ret = redirect(reverse('login'))
    request.session.flush()
    return ret

校验登陆

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Django之cookie 和 session
一、1、cookie的由来!!!    由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。2、什么是cookie?    Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
3A网络 3A网络
1年前
一文读懂浏览器存储与缓存机制
一文读懂浏览器存储与缓存机制浏览器存储CookieCookie是HTTP协议的一种无状态协议。当请求服务器时,HTTP请求都需要携带Cookie,用来验证用户身份。Cookie由服务端生成,存储在客户端,用来维持状态。通常Cookie由以下值构成:名称(name)值(value)域(Domain)值(value)路径(Path)
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这