• Django中的Cookie和Session


    目录

    HttpRequest和HttpResponse对象

    Django中Cookie的设置

    Django中Session的设置 

    Django中Cookie+Session的设置


    关于Cookie和Session,传送门——> Cookie、Session和Token的区别

    HttpRequest和HttpResponse对象

    Django使用请求和响应对象来通过系统传递状态。

    当请求页面时,Django创建一个HttpRequest包含有关请求的元数据的对象。然后Django加载适当的视图,将HttpRequest第一个参数传递给view函数。每个视图都负责返回一个HttpResponse对象。

    Django中Cookie的设置

    服务端响应设置Cookie

    #普通设置
    HttpResponse.set_cookie(key,value='',max_age = None,expires = None,path ='/',domain = None,secure = None,httponly = False,samesite = None)
    
    #加盐   普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
    HttpResponse.set_signed_cookie(key,value ='',salt='盐值' ,max_age = None,expires = None,path ='/',domain = None,secure = None,httponly = False,samesite = None)
    
    • max_age=1 :cookie生效的时间,单位是秒
    • expires:具体过期日期  
    • path='/':指定那个url可以访问到cookie;‘/’是所有; path='/'
    • 4domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
    • secure=False:https安全相关
    • httponly=False:限制只能通过http传输,JS无法在传输中获取和修改

    客户端获取Cookie

    #普通获取
    HttpRequest.COOKIES['key']
    
    #获取加盐的cookie
    HttpRequest.get_signed_cookie(key,default = RAISE_ERROR,salt ='',max_age = None):返回已签名cookie的cookie值,default是设置默认值(当没有获取到cookie的时候),salt盐值提供加密保护

    客户端删除Cookie

    HttpResponse.delete_cookie(key,path ='/',domain = None) #删除cookie中的key值,path是指定路径,domain是指定域

    Django中Session的设置 

    在用session之前,确保你的数据库同步了。即确保你的数据库中有 django_session 这张表。

    设置session

     request.session['username']='xie'

    获取session 

     username=request.session.get('username','anybody')  #如果没有获取到值的话,则设置默认值anybody

    删除session 

    del request.session['username']        

    其他方法 

    # 所有 键、值、键值对
    
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    
    # 用户session的随机字符串
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查 用户session的随机字符串 在数据库中是否
    request.session.exists("session_key")
    
    # 删除当前用户的所有Session数据
    request.session.delete("session_key")
    
    # 注销使用
    request.session.clear()
    
    #设置超时时间,set_expiry(value)方法是在最后一次刷新开始计算
    request.session.set_expiry(value)

    Django中Cookie+Session的设置

    cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,于是cookie+session出现了!我们可以把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),以此来验证用户的身份。

    cookie+session的工作流程:

    1. 当用户成功登录网站时,服务端生成了用户的登录信息session,并且该登录信息对应着一个session_id
    2. 服务端把 session_id放在cookie中,发给浏览器(自动过程,无需我们设置)
    3. 客户端下次访问服务端时,服务端取出该session_id对应的登录信息,来判断用户的登录状态

    我们现在模拟一个注册登录的页面,假设用户名不能重复,我们将用户成功登录后的状态写入session中。当客户端访问需要权限的页面时,然后服务器再从此次session会话中取出客户端的状态来比较,如果存在,则曾经登录过。

    #urls.py

    urlpatterns = [
        path('', views.Register.as_view()),
        path('login/',views.Login.as_view()),
        path('index/',views.index),
        path('logout/',views.logout)
    ]

    #views.py

    from django.shortcuts import render
    from django import forms
    from django.http import HttpResponseRedirect,HttpResponse
    from django.views.generic import View
    from app.models import User
    
    #定义一个form表单
    class UserForm(forms.Form):
        username=forms.CharField(label='用户名')
        password=forms.CharField(label='密码',widget=forms.PasswordInput)
    
    #注册
    class Register(View):
        def get(self,request):
            form=UserForm()
            return render(request,"register.html",context={"form":form})
        def post(self,request):
            form=UserForm(request.POST)
            if form.is_valid():
                username=form.cleaned_data.get('username')
                password=form.cleaned_data.get('password')
                User.objects.create(username=username,password=password)  #写入数据库中
                return HttpResponseRedirect('/login')         #重定向到登录页面
            else:
                form=UserForm()
                return render(request,"register.html",context={"form":form})
    #登录
    class Login(View):
        def get(self,request):
            form=UserForm()
            return render(request,"login.html",context={"form":form})
        def post(self,request):
            form=UserForm(request.POST)
            if form.is_valid():
                username=form.cleaned_data.get('username')
                password=form.cleaned_data.get('password')
                users=User.objects.filter(username=username,password=password)  #查询数据库
                if users:
                    response=HttpResponseRedirect("/index")
                    #如果登录成功,将登录状态is_login设置为True,该此时服务端会自动向客户端返回的Cookie中加入此session_id
                    request.session['is_login']=True
                    request.session['username']=username
                    #设置cookie ,自己可以随便设置字段和值
                    response.set_cookie("id","1")
                    response.set_cookie("age","20")
                    return  response
                else:
                    return HttpResponseRedirect("/login")
            else:
                form=UserForm()
                return render(request,"register.html",context={"form":form})
    def index(request):
        if request.session.get('is_login',None):
             username=request.session.get('username',None)
             content={'username':username}
             return render(request,"index.html",context=content)
        else:
            form=UserForm
            return render(request, "login.html", context={"form": form})
    
    def logout(request):
        response=HttpResponse('注销成功!')
        try:
            del request.session['username']            #删除Session
        except Exception as e:
            print(e)
        finally:
            return response

  • 相关阅读:
    Pycharm配置支持vue语法
    HTTP请求方式
    ModelSerializer Meta设置
    Serializer fields
    django-rest-framework配置json web token
    rest_framework_extensions实现缓存
    手把手搭建K3cloud插件开发环境
    Microsoft Visual Studio 2010(vs10)安装与使用
    spring boot mapper层传参数是用main的arg0(第一个参数),arg1(第二个参数)
    spring boot不要放在tomcat下启动,因为自身就带了集成tomcat
  • 原文地址:https://www.cnblogs.com/csnd/p/11807698.html
Copyright © 2020-2023  润新知