Django-----cookie&session

cookie

保存在用户浏览器端的一个键值对(别人给的凭证)

服务端可以向用户浏览器写cookie

客户端每次发请求会携带cookie去(放在请求头里面)

 

淘宝的cookie  京东的cookie(http的连接很简单,是无状态的,为了登录后下次来还认识,也为了避免再次登录)

功能:1.一段时间内免登录  2.浏览器自动记住账号密码  3.修改每次看的页数(只用修改一次)

禁用浏览器的cookie(无限投票例子)

 

 用户第一次请求时候后端处理代码

复制代码
def login(request):
    if request.method=="GET":
        return render(request,'登录界面')
    else:
        user=request.POST.get('username')
        pwd=request.POST.get('password')
        print(user,pwd)
        if user=='akagi' and pwd== '521':
            obj=redirect('用户后台')
            #obj.set_cookie('ticket','sdfasdas',max_age=10,path='/')#max_age=10 十秒后cookie失效 里面的path属性指定这个cookie内容在哪个url生效         
            obj.set_signed_cookie('ticket','19438',salt='jjjjjj',max_age=10)#cookie加密(签名)需要做异常处理   解密解密p57
            #set_cookie(self, key, value='', max_age=None, expires=None, path='/',
            #       domain=对域名划分sso, secure=https相关, httponly=安全相关js代码无法获取到, samesite=??):
            return obj
        else:
            return render(request, '登录界面')
View Code
复制代码

后端会检查用户请求的时候是否带有相关的cookie,有则通过再做其他操作,无则返回登录界面

复制代码
def classes(request):
    try:
    #tk=request.COOKIES.get('ticket')  #自定义名字
        tk=request.get_signed_cookie('ticket',salt='jjjjjj')  #=加密时候salt要对应 签名
    except KeyError:
        return redirect('/login/')
    #print('tk=',tk)
    if not tk:
            return redirect('/login/')
View Code
复制代码

session(推荐)

保存在服务器端的数据(本质是键值对)

应用的时候依赖于cookie

作用:保持会话( Web网站)

好处:敏感信息不会直接给客户端(cookie容易被伪造,即使签了名也能被破解,因为数据在浏览器端)

原理:用户请求,返回一串随机字符串,然后服务端也保存这个随机字符串为key,一个字典为value(里面可以记录各种数据)

 

 用户第一次请求时候后端处理代码

复制代码
def session_login(request):
    if request.method=='GET':
        return render(request,'session.html')
    else:
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        obj=models.UserAdmin.objects.filter(username=u,password=p).first()
        if obj:
            #1.生成随机字符
            #2.通过cookie发给客户端
            #3.服务端保存(随机字符串1,{'username':'qwe',} ;下次验证两端各一份)   对应cookie里面的sessionid
            #(数据,类似键值对 放到数据库表里面了)
            request.session['username']=obj.username #做三件事123  键值对
            request.session['password'] = obj.password
            #随着增加的键值对越多,数据库session_key不变,session_data变长
            request.session['email'] = 'love@qq.com'
            request.session.set_expiry(5) #设置失效时间
            # * 如果value是个整数,session会在些秒数后失效(适用于整个Django框架,即这个数值时效时整个页面都会session失效)。
            #* 如果value是个datatime或timedelta,session就会在这个时间后失效。
            #* 如果value是0,用户关闭浏览器session就会失效。
            #* 如果value是None,session会依赖全局session失效策略。
            return redirect('/indexxx/')
        else:
            return render(request,'session.html',{'message':'请重新登录'})
View Code
复制代码

对session验证

复制代码
def indexxx(request):
    #1.获取客户端cookie种的随机字符串
    #2.去session种查找有没有随机字符
    #3.去session中查看对应key的value中是否有值
    v=request.session.get('username') #获取session里面key为username的value
    s=request.session.session_key
    b=request.session.values()
    print(s)
    if v:
         return  HttpResponse('ok,登录成功:%s---%s----%s' %(v,s,b))
    else:
        return redirect('/session_login/')
View Code
复制代码

 

 

PS:

DJANGO 设置SESSION过期时间

cookie和session的详解与区别

 

posted @   磕伴  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示