• 18 cookie与session


    添加新博客 编辑本博客

    yuan先生博客

    一、cookie

    • cookie大小限制为4KB
    • 一个服务器最多在客户端浏览器上保存20个cookie
    • 一个浏览器最多能保存300个cookie

    views中添加cookie一定要添加在相应体中,相应体可以是render和redirect或HTTPResponse,render和redirect都属于HTTPResponse对象

    def login(request):
        if request.method=='POST':
            name=request.POST.get('name')
            pwd=request.POST.get('pwd')
            user= UserInfo.objects.filter(name=name,pwd=pwd).first()
            if user:
                responst=HttpResponse("登录成功!")
                responst.set_cookie("is_login",True)
                return responst
            else:
                pass
        else:
            return render(request,'login.html')
    
    def index(request):
        #获取cookie
        cookie=request.COOKIES
        is_login=cookie.get('is_login')
        if is_login:
            return render(request,'index.html')
        else:
            return redirect('/login/')
    View Code

    设置cookie:response.set_cookit(key,val)

    • key
    • val
    • max_age=None,超时时间,以秒为单位,不设置直到浏览器关闭。IE浏览器不支持
    • expires=None,cookie失效的实际日期/时间,固定某个时刻失效,传入datetime测试
      date=datetime.datetime(year=2018,month=7,day=21,hour=4,second=10)
      responst.set_cookie("is_login",True,expires=date)
      View Code
    • path='/',cookie生效路径。浏览器只会回传带有该路径的页面,避免跨应用访问。/表示根路径,特使的:根路径的cookie可以被任何url的页面访问
    • domain=None,cookie生效的域名,可以用该参数构造跨站cookie。如设置domain='.example.com'对www.example.com,email.example.com都有效。不设置只有设置他的域名有效
    • secure=False,设置为true,浏览器将通过https来回传cookie
    • httponly=False,只能http协议传输,无法被JavaScript获取,非绝对

    获取cookie:response.request.COOKIE.get(key)

    删除cookie:response.delete_cookie(cookie_key,path="/",domain=name)

    二、session

    部分数据存放在服务器,给客户端的只是随机字符串。django自己维护一个django-session表

    1. 生成随机字符串
    2. 给浏览器返回cookie,sessionid=随机字符串
    3. 键值对存放到数据库

    设置session,

    在view中对登录进行验证,验证成功后设置session值

    def login_session(request):
        if request.method=='POST':
            name=request.POST.get('name')
            pwd=request.POST.get('pwd')
            user= UserInfo.objects.filter(name=name,pwd=pwd).first()
            if user:
                """
                1、生成随机字符串
                2、给相应体设置cookie,response.set_cookie('sessionid','随机字符串')
                3、在django-session表中创建记录,session-key,session-data
                """
                request.session['is_login']=True
                request.session['username']=user.name
                return HttpResponse('登录成功!')
            else:
                pass
        else:
            return render(request,'login.html')
    View Code

    浏览器得到一个sessionid的cookie

    django-session表中会存在session数据,django对数据做了序列化处理

    获取session

    def index_session(request):
        """
        1、从request.COOKIE.get('sessionid')获取到sessionid值
        2、从django-session中获取该sessionid对应的数据
        3、将对应数据反序列化之后返回
        """
        is_login=request.session['is_login']
        username=request.session['username']
        if is_login:
            return render(request,'index.html',{'username':username})
        else:
            return redirect('/login_session/')
    View Code

     

    更新session

    一个浏览器针对一个服务器只能由一个session存在。重新登录,有数据则更新,无数据则增加

    同一个浏览器重新用其他账号登录,将修改django-session表中session_data数据

    删除session

    不推荐用del方法来做注销,flush()

    del request.session['session_name']

    def logout_session(request):
        del request.session['is_login']
        del request.session['username']
        return redirect('/login_session/')
    View Code

    flush()实现注销功能

    def logout_session(request):
        # del request.session['is_login']
        # del request.session['username']
        """
        1、通过sessionid过滤出改id
        2、在django-session表中删除该条记录
        3、将response中的sessionid的cookie也会删掉
        """
        request.session.flush()
        return redirect('/login_session/')
    View Code

    session其他配置,详见yuan博客

    setting配置中将修改全局的配置

     总结:

    • response.set_cookie(key,val)
    • request.COOKIE.get(key)
    • request.session[key]=val
    • request.session[key]
    • request.session.flush()
  • 相关阅读:
    文件的复制
    反射基础知识
    蓝牙连接 返回的命令
    WebRoot 与 webContent的区别
    时间判断
    java ecplise配置
    异常org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 11; 注释中不允许出现字符串 "--"。的原因
    F、CSL 的神奇序列 【规律】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
    E、CSL 的魔法 【模拟】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
    D、CSL 的字符串 【栈+贪心】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9349574.html
Copyright © 2020-2023  润新知