• Django2.2 会话技术cookie session token的区别以及实例介绍


    一、区别:

    本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个)。在显示相关数据

    1.cookie

    • 属于客户端会话技术(数据存储在客户端)

    • 默认的Cookie会默认自动携带本网站所有cookie
    • 支持过期时间(就是软件中7天免登录之类的)
    • Cookie跨域名,跨网站

    2.session(不做移动端开发,则与token没什么区别)

    • 属于服务端会话技术,数据存储在服务器中(django有个默认的数据表_session)
    • Session默认过期时间是14天
    • 主键是字符串
    • 数据使用了数据安全

    3.Token

    • 服务端会话技术
    • 自定义的session(下面会举例说明自定义)
    • 如果在移动端或客户端开发中,通常以json形式传输需要移动端自己存储Token,需要使用关联数据时,主动传递Token

    二、实例讲解

    2.1 Cookie

     #-------Cookie技术
        path(r'setcookie/',views.set_cookie,name='set_cookie'),
        path(r'getcookie/',views.get_cookie,name='get_cookie'),
    
        #----------实现会话用户登录
        path(r'login/',views.login,name='login'),
        path(r'dologin/',views.do_login,name='do_login'),
        path(r'mine/',views.mine,name='mine'),
        path(r'logout/',views.logout,name='logout'),

    普通不加密:(没有界面。也就是进入该路由则添加Cookie为Rock)
    def set_cookie(request):
    response=HttpResponse("设置cookie")
    response.set_cookie('username','Rock')#---------------------Rock为值
    return response


    def get_cookie(request):
    username=request.COOKIES.get('username')
    return HttpResponse(username)


    加密(加盐,有界面获取登录的用户名)
    def login(request):
    return render(request,'login.html')


    def do_login(request):
    uname=request.POST.get('uname')
    response=HttpResponseRedirect(reverse('App_one:mine'))
    response.set_signed_cookie('content',uname,"Rock")#加密(加‘盐’)
    return response


    def mine(request):
    try:
    uname=request.get_signed_cookie('content',salt="Rock")(得带上‘盐’)

    if uname:
    return render(request,'mine.html',context={"uname":uname,})
    except Exception as e:
    print("获取失败")
    return redirect(reverse('App_one:login'))


    def logout(request):
    response=redirect(reverse("App_one:login"))
    response.delete_cookie("content")
    return response
    
    

    2.2 Session

      #Session登录退出
        path(r'login/',views.login,name='login'),
        path(r'mine/',views.mine,name='mine'),
        path(r'logout/',views.logout,name='logout'),


    def login(request):
    if request.method=="GET":
    return render(request,'App2_login.html')
    elif request.method=="POST":
    username=request.POST.get("username")
    request.session["username"]=username
    return HttpResponse("登录成功")


    def mine(request):
    username=request.session.get("username")
    return render(request,'App2_mine.html',context={"username":username,})


    def logout(request):
    response=redirect(reverse('App_two:mine'))
    #方式一:删除cookie
    #response.delete_cookie("sessionid")

    #方式二:删除session
    #del request.session['username']

    #方式三:全部删除---------删除当前会话,数据库中也会删除(常用)
    request.session.flush()
    return response

    2.3 自定义版本的Session---------Token

    
    
    #实战项目token
    #注册
    path(r'register/',views.register,name='register'),
    #登录
    path(r'studentlogin/',views.student_login,name='student_login'),
    #个人中心
    path(r'studentmine/',views.student_mine,name='student_mine'),





    #
    项目实战登陆注册Token def register(request): if request.method=="GET": return render(request,"student_register.html") elif request.method=="POST": username=request.POST.get("username") passsword=request.POST.get("password") try: student=Student() student.s_name=username student.s_password=passsword student.save() except Exception as e: return redirect(reverse("App_two:register")) return HttpResponse("注册成功") #登录 def student_login(request): if request.method=="GET": return render(request,'student_login.html') elif request.method=="POST": username=request.POST.get("username") password=request.POST.get("password") students=Student.objects.filter(s_name=username).filter(s_password=password) if students.exists(): #这里有点多余,因为用户名唯一 student=students.first() ip=request.META.get("REMOTE_ADDR") token=generate_token(ip,username) student.s_token=token student.save() response=HttpResponse("用户登录成功!") response.set_cookie("s_token",token) return response return redirect(reverse("App_two:student_login")) #自定义生成唯一token def generate_token(ip,username): c_time=time.ctime()#返回str形式,当前时间 r=username return hashlib.new("md5",(ip+c_time+r).encode("utf-8")).hexdigest()----------------哈希表(一定要设置编码格式) #个人中心 def student_mine(request): token=request.COOKIES.get("s_token") try: student=Student.objects.get(s_token=token) except Exception as e: return redirect(reverse("App_two:student_login")) return HttpResponse(student.s_name)
  • 相关阅读:
    C计算double能精确到多少位
    C计算int最大值、最小值
    AndroidStudio右键new无activity
    java替换特殊字符串 $
    lamda表达式排序
    docker toolbox 设置镜像加速
    tomcat优化
    nginx配置相关
    SQL 优化
    elasticsearch 概念初识
  • 原文地址:https://www.cnblogs.com/cybg/p/12080860.html
Copyright © 2020-2023  润新知