HTTP协议是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态;
from until import mysqlhelper
from django.shortcuts import HttpResponse,render,redirect
import json
import datetime
from datetime import timedeltadef 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 weapernow = 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+deltaobj.set_cookie("tile","alan",expires=value,path='/',domain=None,secure=False,httponly=False)obj.set_signed_cookie('k','v',salt="alan",)return objelse: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.tidLEFT 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} )
1、设置cookies(保存数据到客户端)1、不使用模板resp = HttpResponse("给客户端的一句话")resp.set_cookie(key,value,expires)return respkey : 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 resp3、重定向resp = HttpResponseRedirect('/login/')resp.set_cookie(key,value,expires)return resp2、获取cookies(从客户端获取数据)request.COOKIES
from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect
from tools.resis_handler import connect_objdef login(request):resp = redirect('/list_display/')resp.set_cookie('K','alan')return resp
def display(request):print(request.COOKIES['K'])return HttpResponse('OK')
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) #这样取值的不报错,没有拿Nonerequest.session['k1'] = 123request.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_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = 文件路径 # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
session不仅可以保存在数据库里,数据库(默认)缓存(memchache、redis)文件缓存+数据库加密cookieSESSION_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分钟期间有请求服务端,就不会过期!(为什么逛一晚上淘宝,也不会登出,但是不浏览器不刷新了就会自动登出)
缓存 redis memcache
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎浏览器cook(相当于没有用session,又把敏感信息保存到客户端了)
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎