• 2019.03.23 Cookie


    Cookie  曲奇饼干  哈哈哈。通俗的将,应该是发票。

    因为http是无状态操作

    当你访问服务器之后,应该会给你响应发票Cookie记录你访问了什么东西

    便于下次再来查找吧,Cookie有时间的限制。默认是在存储在浏览器的,关闭浏览器之后就会消失了

    设置了时间的话就会在本地生成数据了

    本一节课就讲了普通的Cookie设置和获取

    客户端保存数据

    设置cookie

    1. 普通

    response.set_cookie("uname","zhangsan",expires=value,path='/' )

    1. 加盐

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

    response.set_signed_cookie('k','v',salt="fdsa")

    获取cookie

    1. 普通

    request.COOKIES['hello']
    request.COOKIES.get('hello','')
    1. 加盐

    request.get_signed_cookie('k',salt='fdsa')

    删除值


    #设置过期
    1. 默认情况关闭浏览器就失效
    2. max_age=-1(单位秒)
    3. expires=datetime.datetime.today()+datetime.timedelta(days=-2)(单位日期类型)
    4. response.delete_cookie('login',path='/student/login/')

    涉及属性


    1、max_age=1 :cookie生效的时间,单位是秒

    2、expires:具体过期日期  

    3、path='/':指定那个url可以访问到cookie;'/'是所有 path='/'

    4、domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
      domain='.baidu.com'


    语法


    #设置cookie
    def index_view(request):
      import datetime
       
      response = HttpResponse()
      # response.set_cookie('hello','123',max_age=24*60*60*3,path='/student/abc/')
       
      # response.set_cookie('hello','123',path='/student/abc/',expires=datetime.datetime.today()+datetime.timedelta(days=4))

      response.set_signed_cookie('hello','123',salt='hahaha',path='/student/abc/',expires=datetime.datetime.today()+datetime.timedelta(days=4))

      return response

    #获取cookie
    def abc_view(request):
      #返回所有cookie数据
      print request.COOKIES
      #返回KEY='hello'的数据
      print request.get_signed_cookie('hello',salt='hahaha')
       
      return HttpResponse('hello')

     session就是会话的意思,也就比较像吧,也是说在这个会话中数据会一直被session记录着

    会默认的保存到数据库中的

    1. cookie引入session:

      cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患。

    2. cookie+session 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串)基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;

    3. cookie+session的工作流程:

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

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

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

    1. 保存在服务端session数据格式session_key SessionStore()

      {

      session_key                                       数据字典

      sessionid1:                     {id:1,nam:"alex",account:1000000000 },

      sessionid2:                     {id:1,nam:"eric",account:10}

      }

    Session中存储值


    def session_view(request):
      # SessionStore()
      #设置session数据
      # request.session['user']='zhangsan'

      #设置过期时间(单位秒)
      # request.session.set_expiry(10*60)

      #删除当前user对应的session数据
      # del request.session['user']

      #删除所有session数据(不清空数据库,只删除cookie中的sessionid)
      # request.session.clear()

      #清空数据库中的session数据
      # request.session.flush()

      #获取sessionid
      # print request.session.session_key

      return HttpResponse('保存成功!')

    Session中取值


    def getsession_view(request):

      #session中取值
      user = request.session['user']
      # user = request.session.get('user')

      return HttpResponse('datas:%s'%user)

    Session存储引擎


    #settings.py文件中
      #Session默认存储在数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'

      #内存

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    # 可以存储自定义对象,内存不用json序列化
    # 服务器重启,数据丢失

      #内存+数据库(双缓存)

    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
    # 内存速度快,数据库慢
    # 储存的步骤,先存到内存,在存到数据库
    # 先从内存读,再从数据库读,如果从数据库读到了,再放入内存

      #file

    SESSION_ENGINE = 'django.contrib.sessions.backends.file'
    SESSION_FILE_PATH = os.getcwd()
       
      #signed_cookies

    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
    # 将数据加密,存到cookie中了(存到浏览器)

    将数据保存到Redis数据库中


    pip install django-redis-sessions==0.5.6

    # 使用redis保存session数据
      SESSION_ENGINE = 'redis_sessions.session'
      SESSION_REDIS_HOST = 'localhost'          
      SESSION_REDIS_PORT = 6379                  
      SESSION_REDIS_DB = 4                        
      SESSION_REDIS_PASSWORD = ''              
      SESSION_REDIS_PREFIX = 'session'

     登录用户信息保存session 

    配置URL

    #coding=utf-8

    from django.conf.urls import url
    import views

    urlpatterns=[
      url(r'^sessionlogin/$',views.sessionlogin_view),
      url(r'^usercenter/$',views.center_view),

    ]

    创建视图函数


    class User(object):
      def __init__(self,uname,pwd):
          self.uname = uname
          self.pwd = pwd


    import jsonpickle

    def sessionlogin_view(request):
      uname = request.GET.get('uname','')
      pwd = request.GET.get('pwd','')

      if uname=='zhangsan' and pwd=='123':
          user = User(uname,pwd)

          request.session['user'] = jsonpickle.dumps(user)
          return HttpResponseRedirect('/student/usercenter/')

      return HttpResponse('登录失败')


    def center_view(request):
      user = jsonpickle.loads(request.session['user'])

      return HttpResponse('欢迎%s登录成功!'%user.uname)

    jsonpickle序列化和反序列化

    #coding=utf-8
    from django.http import HttpResponse
    from django.views import View
    import jsonpickle

    class User(object):
    def __init__(self,uname,pwd):
    self.uname = uname
    self.pwd = pwd

    class IndexView(View):
    def get(self,request,*args,**kwargs):
    uname = request.GET.get('uname','')
    pwd = request.GET.get('pwd','')

    if uname=='zhangsan' and pwd=='123':
    user = User(uname,pwd)
    #{"py/object": "demo5.views.User", "uname": "zhangsan", "pwd": "123"}
    # ustr = jsonpickle.encode(user)

    # {"py/object": "demo5.views.User", "uname": "zhangsan", "pwd": "123"}
    ustr =jsonpickle.dumps(user)
    print ustr
    request.session['user'] = ustr

    return HttpResponse('Get请求')

    class GetSession(View):
    def get(self,request,*args,**kwargs):
    user = request.session.get('user','')
    # <demo5.views.User object at 0x0000000003D48588>
    # uuser = jsonpickle.decode(user)

    # <demo5.views.User object at 0x0000000003D1A0F0>
    uuser = jsonpickle.loads(user)
    print uuser
    return HttpResponse('User:%s'%uuser.uname)

    序列化部分字段

    class User(object):
    def __init__(self,uname,pwd):
    self.uname = uname
    self.pwd = pwd

    def __getstate__(self):
    data = self.__dict__.copy()
    del data['pwd']
    return data


    u = User('zhangsan','123')
    s = jsonpickle.encode(u,unpicklable=False)
    # jsonpickle.dumps(u,unpicklable=False)
    print s
    #{"uname": "zhangsan"}

  • 相关阅读:
    Excel表格中一直有一条绿色的竖线
    忘记root密码
    Failed to download metadata for repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
    ElasticSearch在linux环境安装和启动
    mac多版本node共存与切换使用
    gitremote: The project you were looking for could not be found or you don't have permission to view it.
    mac解决安装wget报错的问题
    nginx部署vue项目
    flask+vuesocketio的使用
    flask+vue下载文件
  • 原文地址:https://www.cnblogs.com/Py-king/p/10584423.html
Copyright © 2020-2023  润新知