1. 程式人生 > >Django Web框架要點之類檢視

Django Web框架要點之類檢視

1.類檢視

1.1 在django中類檢視是用類來定義的一個檢視

1.2類檢視有什麼優點

  • 1.2.1 想對於函式檢視來說,雖然函式檢視便於理解。但是遇到一個檢視對應的路徑提供了多種不同HTTP請求方式的支援時,便需要在一個函式中編寫不同的業務邏輯,程式碼可讀性與複用性都不佳。
  • 1.2.2 類檢視程式碼可讀性好,類檢視相對於函式檢視有更高的複用性, 如果其他地方需要用到某個類檢視的某個特定邏輯,直接繼承該類檢視即可,十分契合大型專案的開發。

2. 建立類檢視

  • 2.1 類檢視
from django.views.generic import View

class RegisterView
(View):
"""類檢視:處理註冊""" def get(self, request): """處理GET請求,返回註冊頁面""" return render(request, 'register.html') def post(self, request): """處理POST請求,實現註冊邏輯""" return HttpResponse('這裡實現註冊邏輯')
  • 2.2 配置路由,使用類檢視的as_view()方法來新增
urlpatterns = [
    # 檢視函式:註冊
    # url(r'^register/$', views.register, name='register'),
# 類檢視:註冊 url(r'^register/$', views.RegisterView.as_view(), name='register'), ]
  • 2.3 使用裝飾器裝飾類檢視
  • 2.3.1 準備一個裝飾器
def my_decorator(f):
    def wrapper(request, *args, **kwargs):
        print("裝飾器被呼叫了")
        print('請求路徑%s' % request.path)
        return f(request, *args, **kwargs)

    return
wrapper

  • 2.3.2 裝飾類檢視的兩種方法
在設計裝飾器時基本都以函式檢視作為考慮的被裝飾物件
1.在url中配置裝飾
此種方式最簡單,但因裝飾行為被放置到了url配置中
單看檢視的時候無法知道此檢視還被添加了裝飾器,不利於程式碼的完整性,不建議使用。
此種方式會為類檢視中的所有請求方法都加上裝飾器行為,因為是在檢視入口處,分發請求方式前
url(r'^register/', my_decorator(RegisterView.as_view()), name='register')

2.在類檢視中裝飾
需要注意的是,此中方法不能直接新增裝飾,而是需要使用method_decorator將其轉換為適用於類檢視方法的裝飾器
2.1 在類名位置使用的時候,還需要加上需要被使用的具體的請求方法的name
2.2 檢視原始碼可以發現,如果我們複用父類的dispatch方法,直接給dispatch方法使用裝飾器,相當於給所有的請求方法都加上裝飾器

from django.utils.decorators import method_decorator

# @method_decorator(my_decorator, name='post')
@method_decorator(my_decorator, name='dispatch')
class RegisterView(View):
    """類檢視,處理註冊"""

    def get(self, request):
        """處理get請求,返回註冊頁面"""
        print(request.method)
        return HttpResponse('這是get請求方式返回的註冊頁面')

    # 2.3 還能直接在請求函式名上使用裝飾器,此使用方法可以不需要指定具體的方法
    # @method_decorator(my_decorator)
    def post(self, request):
        """處理post請求,實現註冊邏輯"""
        print(request.method)
        return HttpResponse('這是post請求方式下的註冊邏輯頁面')

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

  • 2.3.3 根據面向物件的多繼承性,可以構造Mixin擴充套件類

讓我們的檢視類在繼承View類的基礎上,再繼承此類,可以完成複用get方法

class MyDecoratorMixin(object):
    """Mixin擴充套件類"""

    def get(self, request):
        print(request.method)
        return HttpResponse('這是get請求方式下返回註冊頁面')


class RegisterView(MyDecoratorMixin, View):
    def post(self, request):
        print(request.method)
        return HttpResponse('這是post請求方式下的註冊邏輯處理頁面')