标签:middle RoCE 修复 操作 超时 目录 method tin 客户端
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
语句来获取cookie
实例:设计登陆认证装饰器
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
删除语法:HttpResponse对象.delete_cookie(key)
实例:登出/注销功能
@login_auth
def logout(request):
obj = redirect('/home/')
obj.delete_cookie('whoami')
return obj
sessionid:session的键生产的随机字符串
django_session
表中(当然也可以通过修改一些设置,让session保存在其他本地文本文件中或内存中)。request.session[key] = value
request.session[key] = value
这句语句时发生的事:
request.session.get(key)
。key
是我们之前设置session时,指定的key,不是生成的那个随机字符串。request.session.get(key)
时发生的事:
request.session.set_expiry(value)
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
标签:middle RoCE 修复 操作 超时 目录 method tin 客户端
原文地址:https://www.cnblogs.com/Mcoming/p/11985672.html