中間件與類視圖的簡單理解

------類視圖
一、類視圖引入
def register(request):
"""處理註冊"""html

  # 獲取請求方法,判斷是GET/POST請求
  if request.method == 'GET':
  # 處理GET請求,返回註冊頁面
    return render(request, 'register.html')
  else:
  # 處理POST請求,實現註冊邏輯
    return HttpResponse('這裏實現註冊邏輯')django

 

from django.views.generic import Viewsession

class RegisterView(View):
"""類視圖:處理註冊"""app

  def get(self, request):
  """處理GET請求,返回註冊頁面"""
    return render(request, 'register.html')框架

  def post(self, request):
  """處理POST請求,實現註冊邏輯"""
    return HttpResponse('這裏實現註冊邏輯')函數

類視圖的好處:
* 代碼可讀性好
* 類視圖相對於函數視圖有更高的複用性, 若是其餘地方須要用到某個類視圖的某個特定邏輯,直接繼承該類視圖便可post

二、類視圖使用
from django.views.generic import Viewurl

urlpatterns = [
  # 視圖函數:註冊
  # url(r'^register/$', views.register, name='register'),
  # 類視圖:註冊
  url(r'^register/$', views.RegisterView.as_view(), name='register'),
  ]spa


三、類視圖原理
@classonlymethod
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
...省略代碼...插件

  def view(request, *args, **kwargs):
    self = cls(**initkwargs)
    if hasattr(self, 'get') and not hasattr(self, 'head'):
      self.head = self.get
      self.request = request
      self.args = args
      self.kwargs = kwargs
      # 調用dispatch方法,按照不一樣請求方式調用不一樣請求方法
      return self.dispatch(request, *args, **kwargs)

    ...省略代碼...

   # 返回真正的函數視圖

   return view


  def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
      handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
      handler = self.http_method_not_allowed
      return handler(request, *args, **kwargs)

四、類視圖使用裝飾器

def my_decorator(func):
  def wrapper(request, *args, **kwargs):
  print('自定義裝飾器被調用了')
  print('請求路徑%s' % request.path)
    return func(request, *args, **kwargs)
  return wrapper

class DemoView(View):
  def get(self, request):
    print('get方法')
  return HttpResponse('ok')

  def post(self, request):
    print('post方法')
  return HttpResponse('ok')

4-一、在URL配置中裝飾
urlpatterns = [
  url(r'^demo/$', my_decorate(DemoView.as_view()))
]

4-二、 在類視圖中裝飾
from django.utils.decorators import method_decorator

# 爲所有請求方法添加裝飾器class DemoView(View):

@method_decorator(my_decorator)
  def dispatch(self, *args, **kwargs):
    return super().dispatch(*args, **kwargs)

  def get(self, request):
    print('get方法')
    return HttpResponse('ok')

  def post(self, request):
    print('post方法')
    return HttpResponse('ok')


# 爲特定請求方法添加裝飾器class DemoView(View):

@method_decorator(my_decorator)
def get(self, request):
  print('get方法')
  return HttpResponse('ok')

def post(self, request):
  print('post方法')
  return HttpResponse('ok')


4-3 構造Mixin擴展類
class MyDecoratorMixin(object): @classmethod
def as_view(cls, *args, **kwargs):
  view = super().as_view(*args, **kwargs)
  view = my_decorator(view)
  return view

class DemoView(MyDecoratorMixin, View):
  def get(self, request):
    print('get方法')
    return HttpResponse('ok')

  def post(self, request):
    print('post方法')
    return HttpResponse('ok')


-----中間件
Django中的中間件是一個輕量級、底層的插件系統,能夠介入Django的請求和響應處理過程,修改Django的輸入或輸出。中間件的設計爲開發者提供了一種無侵入式的開發方式,加強了Django框架的健壯性。
咱們能夠使用中間件,在Django處理視圖的不一樣階段對輸入或輸出進行干預。

一、中間件的定義方法
def simple_middleware(get_response):
# 此處編寫的代碼僅在Django第一次配置和初始化的時候執行一次。

  def middleware(request):
# 此處編寫的代碼會在每一個請求處理視圖前被調用。

    response = get_response(request)

# 此處編寫的代碼會在每一個請求處理視圖以後被調用。

    return response

  return middleware

def my_middleware(get_response):
  print('init 被調用')
  def middleware(request):
    print('before request 被調用')
    response = get_response(request)
    print('after response 被調用')
    return response
  return middleware


# 定義好中間件後,須要在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',
'users.middleware.my_middleware', # 添加中間件
]

二、多箇中間件的執行順序* 在請求視圖被處理前,中間件由上至下依次執行* 在請求視圖被處理後,中間件由下至上依次執行

相關文章
相關標籤/搜索