• Djangok Cookie+session


    http协议是短连接的、且状态的,所以在客户端向服务端发起请求后,服务端在响应头加入cookie响应给浏览器,以此记录客户端的状态

    cook是来自服务端,保存在浏览器 的键值对,主要应用于用户登录

    一、Django应用cookie

    1、设置cookie

    参数:

    1、max_age=1 :后台控制cookie生效的时间,单位是秒
    
    2、expires:具体过期日期  
    
    3、path='/':指定那个url可以访问到cookie;‘/’是所有; path='/'
    
    4、 domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
    
    5、secure=False:https安全相关
    6、httponly=False:只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    7、salt: 加密盐

    1、普通

    obj.set_cookie("title","zhangsan",expires=value,path="/")

    2、加盐:

    普通cookie是明文传输,可以直接在客户端 直接打开,所以需要加盐,解盐之后才能查看

    obj.set_signed_cookie('k','v',salt="zhangge")

    2、获取cookie

    1、普通

    request.COOKIES.get(‘k’)

    2、加盐

    cookies=request.get_signed_cookie('k',salt='zhanggen')

    3、例子

    1、cookies
        1、什么是cookies
            cookies是一种数据存储技术
            将一段文本保存在客户端(浏览器)的一种技术。并可以长时间的保存
        2、cookies的使用场合
            1、保存登录信息
            2、保存用户的搜索关键词
        3、django 中使用 cookies
            1、设置cookies(保存数据到客户端)
                1、不使用模板
                    resp = HttpResponse("给客户端的一句话")
                    resp.set_cookie(key,value,expires)
                    return resp
    
    
                    key : cookie的名称
                    value : 保存的cookie的值
                    expires : 保存的时间,以 s 为单位
    
    
                    ex:
                        resp.set_cookie('uname','zsf',60*60*24*365)
                2、使用模板
                    resp = render(request,'xxx.html',locals())
                    resp.set_cookie(key,value,expires)
                    return resp
                3、重定向
                    resp = HttpResponseRedirect('/login/')
                    resp.set_cookie(key,value,expires)
                    return resp
        
            2、获取cookies(从客户端获取数据)
                request.COOKIES
    
    Django不同响应方式设置cokie

    二、cookie + session

    1、cookie引入session:

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

    2、cookie+session的工作流程:

    1、当用户来访问服务端时,服务端是生成一个随机字符串

    2、当用户登录成功后把{sessionID:随机字符串}组织成键值对 加到cookie里发送给用户

    3、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

    3、保存在服务端session数据格式

    随机字符串                                        用户信息

    傻狍子的随机字符串:        {id:1,nam:"alex",account:1000000000 },

    二狗子的随机字符串:        {id:1,nam:"eric",account:10}

    4、Django应用session:

    def login(request):
        if request.method=='GET':
            return render(request,'login.html')
        else:
            name=request.POST.get('user')
            pwd=request.POST.get('pwd')
            # obj=models.Girl.objects.filter(username=name,passwprd=pwd).first()
            obj = models.Boy.objects.filter(username=name, passwprd=pwd).first()
            if obj:
                #1、生成随机字符串(sessionID)
                #2、通过cookie发送给客户端
                #3、服务端保存{zhanggen随机字符串:{'name':'zhanggen'.'email':'zhanggen@le.com'}}
                request.session['name']=obj.username #在Django 中一句话搞定
                request.session['email'] = 'zhanggen@le.com'
                return redirect('/index')
            else:
                return render(request,'login.html',{'msg':"用户名/密码错误"})
    
    def index(request):
        #1、获取客户端的 sessionID
        #2、在服务端查找是否存在 这个sessionID
        #3、在服务端查看对应的key sessionID键的值中是否有name(有值就是登录过了!!)
        v=request.session.get('name')
        print(v)
        if v:
            return render(request,'index.html',{'msg':v})
        else:return redirect('/login/')

    1、数据库Session

    
    

    Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

    a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)

    SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    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,默认修改之后才保存(默认)



    b. 使用

    def index(request):
    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']

    # 所有 键、值、键值对
    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")

    ...

     

     2、缓存Session

    a. 配置 settings.py
     
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
        SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
     
     
        SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        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,默认修改之后才保存
     
     
     
    b. 使用
     
        同上

    3、文件Session

    a. 配置 settings.py
     
        SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
        SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
     
     
        SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        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,默认修改之后才保存
     

    4、缓存+数据库Session

    数据库用于做持久化,缓存用于提高效率
     
    a. 配置 settings.py
     
        SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
     
    b. 使用
     
        同上

    5、加密cookie session

    a. 配置 settings.py
         
        SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
     
    b. 使用
     
        同上

    6、session注意事项

    (1)、每个用户的保存在 服务端的sessionID保存在数据库里的 sessionID隔离不一样的,不会造成用户间的信息混淆!(淫王一问,我答错了!)

    (2)、如果A用户和B用户在同一个浏览器登录,会!因为保存在浏览器的sessionID先后覆盖了!!

    (3)、如果用户的cookie泄露了,别拿着你的cookie也是可以 访问服务端的,所以cookie一定要保存好。

  • 相关阅读:
    DDD:四色原型中Role的 “六” 种实现方式
    .NET:脏读、不可重复读和幻读测试
    AIR:使用 HTML + Javascript 开发桌面应用
    Silverlight:《Pro Silverlight5》读书笔记 之 Layout
    设计原则:什么样的情况下需要引入父类?
    设计原则:不要为了复用而使用继承
    Ruby:字符集和编码学习总结
    .NET:字符集和编码学习总结
    Ruby:Sublime中开发Ruby需要注意的Encoding事项
    .NET:遇到并发问题,什么样的情况下需要自动重试?
  • 原文地址:https://www.cnblogs.com/pengsq/p/10140506.html
Copyright © 2020-2023  润新知