Cookie 曲奇饼干 哈哈哈。通俗的将,应该是发票。
因为http是无状态操作
当你访问服务器之后,应该会给你响应发票Cookie记录你访问了什么东西
便于下次再来查找吧,Cookie有时间的限制。默认是在存储在浏览器的,关闭浏览器之后就会消失了
设置了时间的话就会在本地生成数据了
本一节课就讲了普通的Cookie设置和获取
设置cookie
-
普通
response.set_cookie("uname","zhangsan",expires=value,path='/' )
-
加盐
普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
response.set_signed_cookie('k','v',salt="fdsa")
获取cookie
-
普通
request.COOKIES['hello'] request.COOKIES.get('hello','')
-
加盐
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记录着
会默认的保存到数据库中的
-
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患。
-
cookie+session 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串)基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;
-
cookie+session的工作流程:
(1)、当用户来访问服务端时,服务端生成一个随机字符串;
(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;
-
保存在服务端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
#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 HttpResponsefrom django.views import Viewimport jsonpickleclass 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'] = ustrreturn 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 = pwddef __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"}