cookie与session简介及操作
为什么会有这些技术
1.目的是为了保存客户端的用户状态
2.原因:HTTP协议是无状态的
cookie
cookie:保存在客户端浏览器上的键值对
cookie虽然是保存在客户端浏览器上的键值对,但它是由服务端设置的,浏览器有权禁止cookie的写入
django如何操作cookie
小白必会三板斧
利用obj对象才可以操作cookie
obj=HttpResponse()
obj=render()
obj=redirect()
return obj
设置cookie
obj.set_cookie('k1','v1')#告诉浏览器设置cookie
获取cookie
request.COOKIES.get('k1')#获取浏览器携带过来的cookie值
设置cookie的超时时间
两个参数都是设置时间,并且都是以秒为单位
区别:如果想要给IE浏览器设置cookie的超时时间,只能用expires
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)
删除cookie
(注销 退出登录)
obj.delete_cookie('k1')
def login(request):
if request.method=='POST':
username=request.POST.get('username')
password=request.POST.get('password')
if username=='jason' and password=='123':
old_path=request.GET.get('next')
if old_path:#防止用户直接访问login页面
obj=redirect(old_path)
else:
obj=redirect('/home/')#默认跳转到首页
# obj.set_cookie('whoami','jason',max_age=10)#告诉浏览器保存一个键值对,max_age=10:十秒后失效
obj.set_cookie('whoami','jason')#告诉浏览器保存一个键值对,max_age=10:十秒后失效
return obj
return render(request,'login.html')
#装饰器
from functools import wraps
def login_auth(func):
@wraps(func)
def inner(request,*args,**kwargs):
#判断当前用户是否登录
print(request.path_info)#只获取url
print(request.get_full_path())#获取url+get参数
if request.COOKIES.get('whoami'):
res=func(request,*args,**kwargs)
return res
else:
target_path=request.path_info
return redirect('/login/?next=%s'%target_path)
return inner
@login_auth
def home(request):
#校验用户是否登录
# if request.COOKIES.get('whoami'):
return HttpResponse('home页面 只有登录的人才可以访问')
@login_auth
def index(request):
return HttpResponse('index页面 只有登录的人才可以访问')
@login_auth
def logout(request):
obj=redirect('/login/')
obj.delete_cookie('whoami')
return obj
session
session:保存在服务端上的键值对
session的工作机制是依赖于cookie的
设置session
django session在创建数据的时候,是针对浏览器的
request.session['k1']='v1'
第一次设置的时候会报错 :没有执行数据库迁移命令,生成django需要用到的一些默认表(django_session)
django的默认session失效时间是14天
request.session['k1']='v1'做了那些事:
1.django内部自动调用算法生成一个随机的字符串(数据也是加密处理)
2.在django_session添加数据
随机字符串 加密之后的数据 失效时间
dnsfj ksdfjksjfksjfdjf
3.将产生的随机字符串返回给客户端浏览器,让浏览器保存
sessionid:随机字符串
获取session
request.session.get('k1')
1.django内部会自动去请求头里面获取cookie
2.拿着sessionid所对应的随机字符串去django_session表中一一比对
3.比对上了就会将随机字符串对应的数据获取出来,自动放在request.session中共程序员调用。如果没有比对上就是一个空字典
删除session
request.session.delete()#客户端和服务端全部删除,只会根据浏览器的不同删除对应的数据
request.session.flush()
设置session失效时间
request.session.set_expriy(5)
request.session.set_expriy(value)
如果value是一个整数,session会在value秒数之后失效
如果value是一个datatime或timedelta,session就会在这个时间后失效
如果value是0,用户关闭浏览器session就会失效
如果value是None,session会依赖全局session失效策略
def set_session(request):#设置session
request.session['k1']='jason666'
request.session.set_expiry(10)#设置失效时间
# request.session['k2']='json666'
# request.session['k']='jasn666'
return HttpResponse('设置成功')
def get_session(request):#获取session
if request.session.get('k1'):
# res=request.session.get('k1')
# res=request.session.get('k2')
# res=request.session.get('k3')
return HttpResponse('获取成功')
return HttpResponse('失效了')
def delete_session(request):#删除session
request.session.delete()#客户端 服务端全部删除
# request.sesion.flush()#建议使用这个
return HttpResponse('删除了')
session补充
能够作为数据库的:数据库软件(关系型,非关系型)、文件、内存
token:加密字符串
django中间件
django默认有七个中间件:
只要你想要做一些网站的全局性功能,你都应该考虑使用django的中间件
1.全局的用户登录校验
2.全局的用户访问频率校验
3.全局的用户权限校验
django的中间件是所以框架里面的做的最完善的
对象 字符串》》》》反射
全局》》》》》》》》中间件
django默认七个中间件,并且支持用户自定义中间件,然后暴露给用户五个可以自定义的方法
需要掌握:
process_request
1.请求来的时候会按照settings配置文件从上往下的顺序,依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法,直接跳过执行下一个中间件
2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走,原路立即返回
process_response
1.响应走的时候会按照settings配置文件从下往上的顺序,依次执行每一个中间件内部定义的process_response方法。
2.该方法必须有两个形参,并且必须返回response形参,不返回直接报错
3.该方法返回什么(httpResponsed对象),前端就能获取什么
当process_request方法直接返回httpResponsed对象之后,会直接从当前中间件里面的process_response往回走,没有执行的中间件都不会再执行
需要了解:
process_view
process_view(self,request,view_name,*args,**kwargs)
1.路由匹配成功之后执行视图函数之前触发
2.如果该方法返回了HttpResponse对象,那么会从下往上经过每一个中间件里面的process_response方法
process_template_response
1.当你返回的对象中含有render属性指向一个render方法的时候才会触发,从下往上的顺序
process_exception
1.当视图函数中出现错误,会自动触发,顺序是从下往上
以上五个方法,会在特定的阶段自动触发(如果形参中含有response,那么必须要返回)
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render
class MyMdd1(MiddlewareMixin):
def process_request(self,request):
print('我是第一个中间件里面的process_request方法')
# return HttpResponse('我是中间件一里面的')
def process_response(self,request,response):
print('我是第一个中间件里面的process_response方法')
return response
# return HttpResponse('我是中间件一里面的')
def process_view(self,request,view_name,*args,**kwargs):
# print(view_name)
# print(args)
# print(kwargs)
print('我是第一个中间件里面的process_view方法')
# return HttpResponse('我是中间件一里面的process_view')
def process_exception(self,request,exception):
print('我是第一个中间件里面的process_exception方法')
print(exception)
def process_template_response(self,request,response):
print('我是第一个中间件里面的奇葩方法')
return response
class MyMdd2(MiddlewareMixin):
def process_request(self,request):
print('我是第二个中间件里面的process_request方法')
# return HttpResponse('我是中间件二里面的')
def process_response(self,request,response):
print('我是第二个中间件里面的process_response方法')
return response
# return HttpResponse('我是中间件二里面的')
def process_view(self,request,view_name,*args,**kwargs):
# print(view_name)
# print(args)
# print(kwargs)
print('我是第二个中间件里面的process_view方法')
# return HttpResponse('我是中间件二里面的process_view')
def process_exception(self,request,exception):
print('我是第二个中间件里面的process_exception方法')
print(exception)
def process_template_response(self,request,response):
print('我是第二个中间件里面的奇葩方法')
return response