[TOC]html
HttpResponse
对象,但如今,咱们操做cookie,则须要使用HttpResponse
对象来设置cookieHttpResponse对象.set_cookie('key','value')
语句来设置cookiedef 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') # 登录成功后要跳转的url(使用登录认证装饰器在登录的url后面携带get请求参数——》 ?next=url) if old_path: # 防止用户直接访问的login页面 obj = redirect(old_path) else: obj = redirect('/home/') # 默认跳转到首页 当用户没有想要访问的网址 obj.set_cookie('whoami','jason') # 告诉浏览器保存一个键值对 return obj return render(request,'login.html')
经过request.COOKIES.get(key)
语句来获取cookie前端
实例:设计登录认证装饰器python
from functools import wraps def login_auth(func): @wraps(func) # wraps做用是 修复被装饰的函数 def inner(request,*args,**kwargs): # 判断当前用户是否登陆 # print('request.path_info:',request.path_info) # 只获取url # print('request.get_full_path():',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
HttpResponse对象.set_cookie('key','value',max_age=n)
HttpResponse对象.set_cookie('key','value',expires=n)
expires
删除cookie会让浏览器立马清楚其保存的响应的键值对程序员
删除语法:HttpResponse对象.delete_cookie(key)
算法
实例:登出/注销功能数据库
@login_auth def logout(request): obj = redirect('/home/') obj.delete_cookie('whoami') return obj
sessionid:session的键生产的随机字符串
django_session
表中(固然也能够经过修改一些设置,让session保存在其余本地文本文件中或内存中)。设置session语法:request.session[key] = value
django
django默认的session失效时间是14天后端
当执行request.session[key] = value
这句语句时发生的事:浏览器
注意:一个项目中,其数据库的django_session表中,不管有多少个session,经过同一种浏览器设置的session只会保存在一行记录中。不一样浏览器设置的session才会保存在不一样的行中。cookie
request.session.get(key)
。key
是咱们以前设置session时,指定的key,不是生成的那个随机字符串。request.session.get(key)
时发生的事:
语法:request.session.set_expiry(value)
失效时间是指到了这个时间,保存在服务端的django_session表中的这个session数据就没用了。以后会被删除。且客户端浏览器上的sessionid的这个cookie也会失效。
request.session.delete()
request.session.flush()
MIDDLEWARE
中书写的各个中间件——》MIDDLEWARE
中书写的各个中间件。process_request
方法返回了一个HttpResponse对象,那么请求会马上中止日后面走(下面的中间件和以后的视图函数都不走),当即原路返回process_request
和 process_response
方法request
形参,放在self
以后process_request
请求来的时候会按照settings配置文件中从上往下的顺序,依次执行每个中间件内部定义的process_request
方法
当请求数据走到中间件时,会执行该方法。若该中间件没有该方法,则会跳过该中间件继续走下一个中间件
该方法一旦返回了HttpResponse对象,那么请求会马上中止日后走,当即原路返回(当process_request
方法直接返回HttpResponse对象以后,会直接从当前中间件里面的process_respone
往回走)
方法参数:
def process_request(self,request):
process_response
视图函数返回的响应数据走的时候,会按照settings配置文件中从下往上的顺序,依次执行每个中间件内部定义的process_response
方法
该方法必须有两个形参request,response
,而且必须返回response
形参,不返回直接报错
该方法返回什么(HttpResponsed对象) 前端就能得到什么,即该方法返回的数据会覆盖掉以前视图函数返回的响应数据。而且若该中间件上面的中间件的process_response
方法也返回了HttpResponsed对象,则会再把该中间件的返回数据再覆盖掉。
方法参数:
def process_response(self,request,response):
process_view
路由匹配成功以后执行视图函数以前触发该方法
若是该方法返回了HttpResponse对象 那么会从下往上一次通过每个中间件里面的process_response
方法
方法参数:
def process_view(self,request,view_name,*args,**kwargs): # view_name 是要执行的视图函数的内存地址
process_template_response
当你返回的对象中含有render
属性指向的是一个render方法的时候才会触发,从下往上的顺序
方法参数:
def process_template_response(self, request, response):
实例
# 让后端视图函数中返回的对象含有render属性的方式 def mdzz(request): print('我是视图函数mdzz') def render(): return HttpResponse('你好呀 我是奇葩') obj = HttpResponse('我很好 好的像个傻逼同样') obj.render = render return obj # 响应数据变成了: 我是视图函数mdzz
process_exception
当视图函数中出现错误,会自动触发,顺序是从下往上
方法参数:
def process_exception(self, request, exception):
在应用文件下(如:app01)新建一个任意名字的文件夹(如:mymddleware)
在mymddleware文件下新建一个任意名字的py文件(如:mymdd.py)
导入方法
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,render,redirect
在mymdd文件中自定义类,一个类就是一个中间件。类内部写上面提到的5个django中间件中经常使用的方法
在settings文件的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.mymdd.MyMdd1', # 添加自定义中间件 'app01.mymiddleware.mymdd.MyMdd2', # 添加自定义中间件 ]
class MyMdd1(MiddlewareMixin): def process_request(self,request): print('我是第一个中间件里面的process_request方法') # return HttpResponse("我是中间件一里面的") def process_response(self,request,response): """ :param request: :param response: 就是后端返回给前端的数据 :return: """ 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): """ :param request: :param response: 就是后端返回给前端的数据 :return: """ 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