文章目录
- 工作原理
- 浏览器端第一次访问服务器,提交客户端信息
- 服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
- 浏览器端再次访问服务器端时会携带服务器端创建的Cookie信息
- 服务器端通过Cookie信息,辨别客户端状态来动态生成客户端请求的内容
- 示意图
HTTP协议是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态;
-
- 普通:obj.set_cookie(“tile”,“alan”,expires=value,path=‘/’ )
- max_age=1 :cookie生效的时间,单位是秒
- expires:具体过期日期
- path=‘/’:指定那个url可以访问到cookie;‘/’是所有; path=‘/’
- domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
- secure=False:https安全相关
- httponly=False:限制只能通过http传输,JS无法在传输中获取和修改
- 加盐:obj.set_signed_cookie(‘k’,‘v’,salt=“alan”)
- 普通:obj.set_cookie(“tile”,“alan”,expires=value,path=‘/’ )
-
- request.COOKIES.get(‘k’)
- cookies=request.get_signed_cookie(‘k’,salt=‘alan’)
-
- 视图函数
from until import mysqlhelper from django.shortcuts import HttpResponse,render,redirect import json import datetime from datetime import timedelta def cookie_auth(func): def weaper(request,*args,**kwargs): cookies = request.get_signed_cookie('k', salt='alan') if cookies == 'v': return func(request) else: return HttpResponse('OK') return weaper now = datetime.datetime.utcnow() delta = timedelta(seconds=10) def login(request): if request.method=='GET': return render(request,'login.html') else: name = request.POST.get('N') pwd=request.POST.get('P') if name=="alex" and pwd=="123": obj=redirect("/modal") # obj.set_cookie("tile","alan",max_age=1,) value=now+delta obj.set_cookie("tile","alan",expires=value,path='/',domain=None,secure=False,httponly=False) obj.set_signed_cookie('k','v',salt="alan",) return obj else: return render(request,'login.html') def test(request): return render(request,'layout.html') @cookie_auth def modal(request): sql=''' SELECT teacher.id as tid,teacher.`name`as tname,class.title FROM day64.teacher LEFT JOIN teacher_class ON day64.teacher.id=day64.teacher_class.tid LEFT JOIN day64.class ON day64.teacher_class.cid=day64.class.id; ''' teacher_list= mysqlhelper.get_list(sql,[]) res={} for row in teacher_list: tid=row["tid"] if tid in res: res[tid]["titles"].append(row["title"]) else: res[tid]={'tid':row["tid"],'tname':row["tname"],'titles':[row["title"],]} class_list=mysqlhelper.get_list("SELECT id ,title FROM day64.class" ,[]) return render(request,'modal.html',{"list":res.values(),"class_list":class_list} )
- 不同相应方式设置cookie
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
- redirect方法设置cokie
from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect from tools.resis_handler import connect_obj def login(request): resp = redirect('/list_display/') resp.set_cookie('K','alan') return resp def display(request): print(request.COOKIES['K']) return HttpResponse('OK')
- 视图函数
session的介绍
- 工作原理
- 浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
- 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
- 服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
- 每次用户第一次访问服务端, 把用户的唯一字符串 session_id加到cookie里面,发送给客户端;
- 服务器端保存 随机字符串(sessionID:{用户信息})服务端
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、服务端保存{alan随机字符串:{'name':'alan'.'email':'alan@le.com'}} request.session['name']=obj.username #在Django 中一句话搞定 request.session['email'] = 'alan@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/')
-
使用参数
def index(request): # 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) #这样取值的不报错,没有拿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() request.session.session_key # 用户session的随机字符串 request.session.clear_expired() # sessionID在客户端,过期后自动失效; # 但session信息存储在数据库里,sessionID过期后怎么删除呢? # 无法动态删过期的session,可执行这个方法!(数据库中不仅存储了session 还有该session的过期时间,这个方法就是where数据库里时间过期的session删除掉) request.session.exists("session_key") # 检查用户session的随机字符串 在数据库中是否 request.session.delete("session_key") # 删除当前用户的所有Session数据 request.session.set_expiry(value) # 设置session过期时间 * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
-
session配置文件
#session配置文件 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = 文件路径 # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T session不仅可以保存在数据库里, 数据库(默认) 缓存(memchache、redis) 文件 缓存+数据库 加密cookie SESSION_COOKIE_NAME="alan" # 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 = 600000 # Session的cookie失效日期(2周) 默认1209600秒 SESSION_EXPIRE_AT_BROWSER_CLOSE =True # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = True 如果你设置了session的过期时间 30分钟后,这个参数是False30分钟过后,session准时失效 如果设置 True,在30分钟期间有请求服务端,就不会过期!(为什么逛一晚上淘宝,也不会登出,但是不浏览器不刷新了就会自动登出)
-
session保存位置配置
缓存 redis memcache SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 浏览器cook(相当于没有用session,又把敏感信息保存到客户端了) SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
- cookie数据保存在客户端,session数据保存在服务端。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
- 单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能4K。
- 所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/143950.html