[toc]html
HTTP协议的无状态特性致使每次的请求都是独立的,即客户端和服务器在某次会话中产生的数据不会被保存,所以产生了Cookie,用来保存客户端的用户状态python
普通算法
obj.set_cookie(key,value,...)
加盐数据库
obj.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
# views.py def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'wick' and password == '123': next_url = request.GET.get('next') obj = redirect('/home/') if next_url: obj = redirect(next_url) obj.set_cookie('whoami', 'wick',max_age=30) return obj return render(request, 'login.html')
获取cookiedjango
request.COOKIES.get('key')
浏览器
获取加盐的cookie值安全
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
服务器
from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args, **kwargs): print(request.path_info) print(request.get_full_path()) # 判断当前用户是否登陆 if request.COOKIES.get('whoami'): res = func(request,*args, **kwargs) return res else: target_url = request.path_info return redirect(f'/login/?next={target_url}') return inner
obj.delete_cookie('key'):删除用户浏览器上以前设置的cookie值cookie
@login_auth def logout(request): obj = redirect('/login/') obj.delete_cookie('whoami') return obj
设置Session时发生的事情:网络
设置Session值
request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置
设置Session和Cooike的超时时间
request.session.set_expiry(value)
获取Session时发生的事情:
获取Session
# 1. Session中数据 request.session['k1'] request.session.get('k1',None) # 2. 会话session的key request.session.session_key # 3. 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 4. 全部 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()
# settings.py文件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
# 在settings.py的MIDDLEWARE配置项中注册上述两个自定义中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'app01.mymiddleware.mymidd.MyMidd1', # 自定义中间件MD1 'app01.mymiddleware.mymidd.MyMidd2' # 自定义中间件MD2 ]
# app01/mymiddleware/mymidd.py from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1里面的 process_request") class MD2(MiddlewareMixin): def process_request(self, request): print("MD2里面的 process_request") pass
# app01/mymiddleware/mymidd.py from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1里面的 process_request") def process_response(self, request, response): print("MD1里面的 process_response") return response class MD2(MiddlewareMixin): def process_request(self, request): print("MD2里面的 process_request") pass def process_response(self, request, response): print("MD2里面的 process_response") return response
# app01/mymiddleware/mymidd.py from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1里面的 process_request") def process_response(self, request, response): print("MD1里面的 process_response") return response def process_view(self, request, view_func, view_args, view_kwargs): print("-" * 80) print("MD1 中的process_view") print(view_func, view_func.__name__) class MD2(MiddlewareMixin): def process_request(self, request): print("MD2里面的 process_request") pass def process_response(self, request, response): print("MD2里面的 process_response") return response def process_view(self, request, view_func, view_args, view_kwargs): print("-" * 80) print("MD2 中的process_view") print(view_func, view_func.__name__)
以上,process_request、process_view默认为顺序,process_exception、process_exception、process_response 默认为倒序
客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比 ,对数据库和服务器压力大,所以产生了Token
减轻服务器的压力,减小频繁的查询数据库,使服务器更加健壮
优势: 只要登陆一次之后一直可使用
缺点: 客户端须要带设备号/mac地址做为参数传递,并且服务器端还须要保存
若服务器的Token超时后,将客户端传递的Token向数据库中查询,同时并赋值给变量Token,如此,Token的超时又从新计时
问题
在网络很差或者并发请求时会致使屡次重复提交数据
解决方案( 将session和Token套用 )