[toc]html
保存在客户端浏览器上的键值对前端
虽然cookie
是保存在客户端浏览器上的键值对 可是是服务端设置的 浏览器有权禁止cookie的写入python
# 小白必回三板斧 obj = HttpResponse() return obj # 效果都是同样的
# 设置cookie obj.set_cookie('key','value') # 告诉浏览器设置 # 获取cookie request.COOKIES.get('key') # 获取浏览器携带过来的cookies
# cookie的骚操做 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('username') if username == 'long' and password == '123': # 登录成功 设置cookie obj = redirect('/home/') obj.set_cookie('k1','long') return obj return render(request, 'test.html', locals()) # 校验用户是否登陆 def home(requset): if request.COOKIES.get('k1'): return HttpResponse('登陆成功') return redirect('/login/')
# 如何设置cookie超时时间 obj.set_cookie('k1','v1', max_age=5) # 秒为单位 obj.set_cookie('k1','v1', expires=5) # 秒为单位 # 都是设置超时时间 而且都是秒为单位 区别: 给ie浏览器设置cookies设置超时时间 只能用 expires参数.
# 装饰器 from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args, **kwargs): # 判断当前用户是否登陆 if request.COOKIES.get('k1'): res = func(request, *args, **kwargs) return res else: current_url = request.path_info return redirect('/login/?next=%s'%current_url) return inner
request.path_info
只拿url算法
reque*st.get_full_path()
拿url 加get请求的部分数据库
..... obj = redirect('/login/') obj.delete_cookie('k1') return obj
保存在服务端上面的键值对 session的工做机制是须要依赖于cookie的django
# 设置session request.session['k1'] = 'v1' # 获取session request.session.get('k1') # 拿到随机字符串 request.session.session_key() # 存在则不设置 request.session.setdefault('k1',123) # 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 删除 request.session.delete() request.session.flush() # 只删客户端 这用于确保前面的会话数据不能够再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 若是value是个整数,session会在些秒数后失效。 * 若是value是个datatime或timedelta,session就会在这个时间后失效。 * 若是value是0,用户关闭浏览器session就会失效。 * 若是value是None,session会依赖全局session失效策略。
会自动将数据存在django_session
表中 默认过时时间是 14
天后端
为了数据的安全 数据库中不会明文暴露用户信息 因此是密文浏览器
1.django内部自动帮你调用算法生成一个随机字符串安全
在django session添加数据 (数据也是加密的) >>> 随机字符串 加密后的数据 失效时间cookie
将生产的随机字符串放回给客户端浏览器, key
是 sessionid
value
是 随机字符串
sessionid:随机字符串
1.django
内部会自动去请求头里面获取cookie
2. 拿着`sessionid`对应的随机字符串去`django_session`表中一一比对 3. 若是对比上了 会将随机字符串对应的数据取出来 自动反入` request.session`中供你调用 若是没有就是一个空字典
django session
在建立数据的时候 是针对浏览器的 因此只会保存一条
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。通常做为邀请、登陆系统使用。
相似于django的保安 一共有 7 个中间件
而且支持用户自定义中间件
让后暴露给用户五个
能够自定义的方法 随意建立一个py文件 填代码便可 写完后须要 注册 (****)
只要你想作一些网站的全局性功能 你都应该考虑使用django的中间件 好比: 全局的用户登陆校验, 全局的用户访问频率校验, 全局的用户权限校验
须要掌握:
process_request
请求来的时候触发 参数 request
class SecurityMiddleware(MiddlewareMixin): # 他们都继承了 middleware pass from django.utils.deprecation import MiddlewareMixin # 模块的导入 # 写本身的类继承 Middleware class MyMdd1(MiddlewareMixin): def process_request(self, request): print('xxx') return HttpResponse('我是xxx的response') # 该方法一旦返回了httpresponse对象 那么请求会马上中止日后走原路马上返回
process_response
响应走的时候触发 参数 request
response
且必需要返回response
他就是后端返回给前端的数据~
class MyMdd1(MiddlewareMixin): def process_response(self, request, response): print('test') return response # 必须放回response 不返回直接报错! # 请求来的时候是从上往下 # 响应走的时候是从下往上
须要了解:
process_views
参数: request
view_name
*args
**kwargs
路由匹配成功以后 执行视图函数以前
def process_views(self, request, view_name, *args, **kwargs): return HttpResponse('xx') # 若是返回 HttpResponse 会从头执行process_response
process_template_response
参数: request
response
当你返回的对象中含有render属性的时候会自动触发
def process_template_response(self, request, response) # 若是形参中有response 就必须返回response print('xxx') return response # 须要触发须要写个函数 def index(requset): def render(): reutrn HttpResponse('xxx') obj = HttpResponse('xxxx') obj.render = render return obj
process_exception
参数 : request
exception
当视图函数有异常时会自动触发 顺序是 从下往上
def process_exception(self, requset, exception): print(exception)