• Django之cookie&session


    cookie

    Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息

    我理解的cookie就是服务器端在用户浏览器中写下的信息,用来存储用户当前的状态或该用户相关的信息,如是否已经登录。
    使用cookie的原因:HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。

    在Django中使用cookie

    一个用户登录的例子:
    用户登录后,在其浏览器中写入username键值对,并在其他页面判断是否有username

    
    class login(views.View):
        def get(self,req,*args,**kwargs):
            return render(req, "app1/login.html", {'massage': ''})
    
        def post(self,req,*args,**kwargs):
            user = req.POST.get('user')
            pwd = req.POST.get('pwd')
            c = models.Administrator.objects.filter(username=user, password=pwd).count()
            if c > 0:
                rep = redirect('/index/')
                newuser = user.encode('utf-8').decode('latin-1')
                rep.set_cookie('username', newuser, max_age=10)
                return rep
            else:
                massage = '用户名或密码错误'
            return render(req, "app1/login.html", {'massage': massage})
    
    def index(req):
        username=req.COOKIES.get('username')
        if username:
            newuser=username.encode('latin-1').decode('utf-8')
            return render(req, "app1/index.html", {"name": newuser})
        return redirect("/login")
    

    查看set_cookie参数

    
    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                   domain=None, secure=False, httponly=False, samesite=None):
    
    • key :键
    • value :值
    • max_age :cookie的生效时间
    • expires :cookie的具体过期时间
      它和max_age功能类似,如果不设置expires,函数会根据max_age自动设置expires,原因是ie浏览器需要expires
    • path :指定那个url可以访问到cookie,默认为’/‘,表示所有url
    • domain :指定那个域名以及它下面的子域名可以访问这个cookie,默认为当前域名
    • secure :https安全相关,当secure属性设置为true时,cookie只有在https协议下才能上传到服务器,而在http协议下是没法上传的
    • httponly :限制只能通过http传输,JS无法在传输中获取和修改
    • samesite :好像是2.1中的新功能,此标志可防止cookie在跨站点请求中发送,从而防止CSRF攻击并使某些方法无法窃取会话cookie。None表示不适用此标志,还有Strict与Lax参数,具体查看https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-SESSION_COOKIE_SAMESITE

    删除cookie

    response.delete_cookie('key')
    

    session

    session本意为开会,会议,在这里我们可以叫它会话,既然是会话,那么就是一段时间的交流,交流的状态就需要保持着。
    对于cookie来说,数据或者用户相关信息是存放在客户的浏览器上,这样导致你的相关信息容易被暴露,让别人更容易进行cookie欺骗,如果可以将相关信息存放到服务器端,那么这种风险就会相对较低一些。使用的方式就是session
    客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上叫做session,当客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。客户端识别是哪一个用户的方式为为其分配一个SessionId。
    session内部也是通过cookie实现的。

    在Django中使用session

    依然是登录认证的例子
    首先登录视图函数

    
    class login(views.View):
        def get(self,req,*args,**kwargs):
            return render(req, "app1/login.html", {'massage': ''})
    
        def post(self,req,*args,**kwargs):
            user = req.POST.get('user')
            pwd = req.POST.get('pwd')
            c = models.Administrator.objects.filter(username=user, password=pwd).count()
            print(c)
            if c > 0:
                req.session['is_login'] = True
                req.session['username'] = user
                return redirect('/index/')
            else:
                massage = '用户名或密码错误'
            return render(req, "app1/login.html", {'massage': massage})
    

    用于判断用户是否登录的装饰器

    
    def auth(func):
        def inner(request, *args, **kwargs):
            is_login = request.session.get('is_login')
            if is_login:
                return func(request, *args, **kwargs)
            else:
                return redirect('/login')
        return inner
    

    至于其他登陆后进行处理的函数,只需要为其添加auth装饰器即可
    这里发现,对于设置session和拿取session,和cookie的操作方式类似,那么它将设置的信息存储到了哪呢?答案是存到了数据库中
    在数据库中发现了一张diango_session的表,存储的信息为

    这里的信息应该是用某种加密算法加密了,expire_data为session存在截止时间

    session的其他方法

    • request.session.setdefault(‘k1’,123) 存在则不设置
    • del request.session[‘k1’] 删除某条
    • request.session.clear() 删除所有
    • request.session.keys() 获得所有的key,输出为dict_keys([‘is_login’, ‘username’]),可for循环,不可以通过索引取值
    • request.session.values() 获得所有的值,输出dict_values([True, ‘sfencs’]),同上
    • request.session.items() 获得所有键值,输出dict_items([(‘is_login’, True), (‘username’, ‘sfencs’)]),同上
    • request.session.session_key 获得用户session的随机字符串
    • request.session.clear_expired() 将所有Session失效日期小于当前日期的数据删除
    • request.session.exists(“session_key”) 检查用户session的随机字符串在数据库中是否存在
    • request.session.set_expiry(value) 自己设置了过期时间,默认为两周。
      如果value是个整数,session会在些秒数后失效。
      如果value是个datatime或timedelta,session就会在这个时间后失效。
      如果value是0,用户关闭浏览器session就会失效。
      如果value是None,session会依赖全局session失效策略。

    session的配置

    SESSION_COOKIE_NAME = "sessionid"   # 存在浏览器的cookie键名
    SESSION_COOKIE_PATH = "/"                  #session的cookie的使用路径
    SESSION_COOKIE_DOMAIN = None         # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False         # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True      # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600          # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False       # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False          # 是否每次请求都保存Session,默认修改之后才保存(默认)
    
  • 相关阅读:
    第七周作业
    第六周作业
    第四周作业
    第三次作业
    第二次作业
    最后一次作业-- 总结报告
    第十四,十五周作业
    第七周作业
    第六周作业
    第四周作业
  • 原文地址:https://www.cnblogs.com/sfencs-hcy/p/9962659.html
Copyright © 2020-2023  润新知