Django中间件

django中间件最多可以写五个方法:

process_request、process_response、process_view、process_exception、process_render_template

 

 

 

 

 

 

 

 

 

 

 

执行顺序:

    先从上到下执行所有的process_request方法,然后匹配路由,拿到view函数,再从中间件的开始位置从上到下执行所有

     process_view方法,匹配路由,执行view函数,然后从下到上倒着执行中间件process_response函数,如果在执行过程

     中有错误,会执行process_exception方法,如果view函数中有render方法,则会执行process_render_template方法

     其中,若process_request方法有返回值,则会从同级直接原路返回,django以前版本,会从中中间件结束位置,倒着返回

 

django中的csrftoken中间件就是通过process_view方法实现的

process_view方法会做下列两件事:    

    会检查视图是否被 @csrf_exempt (免除csrf认证)
    去请求体或cookie中获取csrftoken的随机字符串

遇到csrftoken的两种情况:

#情况一:view函数只有少数不需要crsftoken认证
MIDDLEWARE = [
                        'django.middleware.security.SecurityMiddleware',
                        'django.contrib.sessions.middleware.SessionMiddleware',
                        'django.middleware.common.CommonMiddleware',
                        'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf认证
                        'django.contrib.auth.middleware.AuthenticationMiddleware',
                        'django.contrib.messages.middleware.MessageMiddleware',
                        'django.middleware.clickjacking.XFrameOptionsMiddleware',
                    ]
                    
                    
from django.views.decorators.csrf import csrf_exempt
#FBV: @csrf_exempt
# 该函数无需认证 def users(request): user_list = ['alex','oldboy'] return HttpResponse(json.dumps((user_list)))

#CBV:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
class StudentsView(View):

  @method_decorator(csrf_exempt)
  def dispatch(self, request, *args, **kwargs):
    return super(StudentsView,self).dispatch(request, *args, **kwargs)

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

方式二:

@method_decorator(csrf_exempt,name='dispatch')
class StudentsView(View):

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')




#情况二:view函数只有少数需要认证

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf认证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

#FBV:
from django.views.decorators.csrf import csrf_exempt
@csrf_protect # 该函数需认证
def users(request):
  user_list = ['alex','oldboy']
  return HttpResponse(json.dumps((user_list)))

 

#CBV:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
class StudentsView(View):

  @method_decorator(csrf_protect)
  def dispatch(self, request, *args, **kwargs):
    return super(StudentsView,self).dispatch(request, *args, **kwargs)

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

方式二:

@method_decorator(csrf_protect,name='dispatch')
class StudentsView(View):

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

FBV:view视图是用函数写的

#url:
from django.conf.urls import url
urlpatterns = [
    url(r'^users/', views.users),  
]

#view
def users(request):
    user_list=['alex','oldboy']
    return HttpResponse(json.dumps(user_list))

CBV:view视图是用类实现的

#url:
urlpatterns = [
    url(r'^student/',views.StudentView.as_view()),

]

#view
from django.views import View
class StudentView(BaseView):
    def get(self,request):
       return HttpResponse('GET')

    def post(self,request):
       return HttpResponse('POST')

    def put(self,request):
       return HttpResponse('PUT')

    def delete(self,request):
       return HttpResponse('DELETE')
CBV实现原理
基于反射实现根据请求方式不同,执行不同的方法
url -> view方法 -> dispatch方法(反射执行其他:GET/POST/DELETE/PUT)
流程:

class StudentsView(View):
  def dispatch(self, request, *args, **kwargs):
    print('before')
    ret = super(StudentsView,self).dispatch(request, *args, **kwargs)
    print('after')
    return ret

  def get(self,request,*args,**kwargs):
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

 

继承(多个类共用的功能,为了避免重复编写):
from django.views import View

class MyBaseView(object):
  def dispatch(self, request, *args, **kwargs):
    print('before')
    ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
    print('after')
    return ret

class StudentsView(MyBaseView,View):

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

class TeachersView(MyBaseView,View):

  def get(self,request,*args,**kwargs):
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

 

posted @ 2018-03-05 16:54  星雨5213  阅读(69)  评论(0)    收藏  举报