Cookie一.前言1.http协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行状况和结果与前面的请求和以后的请求都无直接关系,它不会受前面的请求响 应状况直接影响,也不会直接影响后面的请求响应状况.2.cookie产生背景; 状态能够理解为客户端和服务器在某次会话中产生的数据,那无状态的就觉得这些数据不会被保留。会话中产生的数据又是 咱们须要保存的,也就是说要“保持状态”.3.什么是cookie? Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带 这些键值对,以便服务器提取有用信息。4.cookie的原理: 由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能经过 Cookie的内容来判断这个是“谁”了。5.cookie的劣势 Cookie虽然在必定程度上解决了“保持状态”的需求,可是因为Cookie自己最大支持4096字节,以及Cookie自己保存在客户端,可能被拦截或窃取二.Django 中操做Cookie1.获取Cookierequest.COOKIE['key'] 普通request.get_signed_cookie('key',default=RAISE_ERROR, salt=' ',max_age=None)get_signed_cookie方法的参数: default: 默认值 salt: 加密盐 max_age: 后台控制过时时间2.设置Cookierep = HttpResponse(...)rep = render(request, ...)rep.set_cookie(key,value,...)rep.set_signed_cookie(key,value,salt='加密盐',...) 参数: key, 键 value='', 值 max_age=None, 超时时间 expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie能够被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,没法被JavaScript获取(不是绝对,底层抓包能够获取到也能够被覆盖)3.删除Cookiedef logout(request): rep= redirect('/login') rep.delete_cookie('is_login') return rep示例: from django.shortcuts import render,redirect,HttpResponse #装饰器 def login_required(func): def inner(request,*args,**kwargs): return_url=request.path_info #home获取用户输入的查询信息 print(111) if request.COOKIES.get('is_login','')=='True': #若是该用户在线 # if request.get_signed_cookie('is_login','',salt='xxx')=='True': #加盐获取cookie ret=func(request,*args,**kwargs) #执行home函数将结果赋值给ret return ret #返回ret else: return redirect('/login/?ReturnUrl={}'.format(return_url)) #若是用户还没登陆直接跳转到login页面 # 加上用户访问的 页面路径信息 return inner def login(request): err_msg='' if request.method=='POST': username=request.POST.get('username') pwd=request.POST.get('pwd') if username=='alex' and pwd=='alex': #当用户验证成功之后 return_url=request.GET.get('ReturnUrl') #获取用户想要访问的页面路径信息 # print(return_url) if return_url: #若是访问的路径存在 print('aaa') # print(return_url) ret = redirect(return_url) # 则直接跳转到访问页面 else: ret= redirect('/index/') #若是路劲信息不存在 则直接跳转到index ret.set_cookie('is_login','True') #保存状态 设置COOKIE # ret.set_signed_cookie('is_login','True',salt='xxx') #加盐 return ret else: #用户验证不成功 err_msg="用户名或密码错误" return render(request,'login.html',{'err_msg':err_msg}) # def index(request): # if request.COOKIES.get('is_login')=='True': # return render(request,'index.html') # else: # return redirect("/login/") @login_required def index(request): return render(request,'index.html') @login_required #先执行装饰器 def home(request): #匹配到home执行home函数 return HttpResponse('这是home页面') # 删除 @login_required def logout(request): rep= redirect('/login') rep.delete_cookie('is_login') return repSession一.前言1.产生背景 Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;可是Cookie以文本的形式保存在本地,自身安全性较差; 因此咱们就经过Cookie识别不一样的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。2.session的优点 支持更多的字节,而且他保存在服务器,有较高的安全性二.Django 中Session相关方法1.获取session中的数据 request.session['k1'] request.session.get('k1',None)2.设置session中的数据 request.session['k1']=123 request.session.setdefault('k1',123)3.删除session中的数据 del request.session['k1']4.全部键 request.session.keys() request.session.iterkeys()5.全部值 request.session.values() request.session.itervalues()6.全部键值对 request.session.iteritems()7.会话session的key request.session.session_key8.将全部Session失效日期小于当前日期的数据删除 request.session.clear_expired()9.检查会话session的key在数据库中是否存在 request.session.exists("session_key")10. 删除当前会话的全部Session数据 request.session.delete()11.删除当前的会话数据并删除会话的Cookie request.session.flush() 这用于确保前面的会话数据不能够再次被用户的浏览器访问12. 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) *若是value是个整数,session会在些秒数后失效。 * 若是value是个datatime或timedelta,session就会在这个时间后失效。 * 若是value是0,用户关闭浏览器session就会失效。 * 若是value是None,session会依赖全局session失效策略。三.Django中的Session配置1. 数据库Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)2. 缓存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也能够是memcache),此处别名依赖缓存的设置3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,若是为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()4. 缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎其余公用设置项: 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,默认修改以后才保存(默认)