Python菜鳥之路:Django 路由補充1:FBV和CBV - 補充2:url默認參數

1、FBV和CBVhtml

  在Python菜鳥之路:Django 路由、模板、Model(ORM)一節中,已經介紹了幾種路由的寫法及對應關係,那種寫法能夠稱之爲FBV: function base view 。python

  今天補充另一種路由關係的寫法:CBV,即:class base view , 也能夠看作爲面向資源編程的另一種叫法,相似tornado中的路由寫法。django

1. 創建路由關係urls.py編程

from app01 import views

urlpatterns = [
    url(r'^home/', views.Home.as_views()),
]

2. 書寫處理邏輯views.pyapp

from django.views import View
class Home(View):  # 這裏須要注意,必須繼承View類
     # dispatch能夠不寫,僅僅做爲了解,明白在全部類中,優先會執行dispatch方法,便於擴展
    def dispatch(self, request, *args, **kwargs):
        # 調用父類中的dispatch
        print('before')  # 相似裝飾器的功能
        result = super(Home,self).dispatch(request, *args, **kwargs)
        print('after')  # 相似裝飾器的功能
        return result

    def get(self,request):
        print(request.method)
        return render(request, 'home.html')

    def post(self,request):
        print(request.method,'POST')
        return render(request, 'home.html')

2、url中的默認參數urls.py函數

urlpatterns = [
    url(r'^index/', views.index, name='root'),
]

或者

urlpatterns = [
    url(r'^index/', views.index, {'name':'root',}),
]

  對應地,在views.py中,函數也須要有一個參數來接收默認參數tornado

def index(request,name):
    print(name)
    return HttpResponse('OK')

3、FBV和CBV的用戶驗證裝飾器post

  FBV簡單,就是一般所用到的函數的裝飾器。而CBV的用戶驗證,能夠用上面提到的dispatch方法,也能夠用另一種方法,請往下看url

# FBV的用戶驗證裝飾器
def auth(func):
    def inner(reqeust,*args,**kwargs):
        v = reqeust.COOKIES.get('username111')
        if not v:
            return redirect('/login/')
        return func(reqeust, *args,**kwargs)
    return inner

@auth
def index(reqeust):
    # 獲取當前已經登陸的用戶
    v = reqeust.COOKIES.get('username111')
    return render(reqeust,'index.html',{'current_user': v})

------------------spa

from django import views
from django.utils.decorators import method_decorator

class Order(views.View):
    @method_decorator(auth)
    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})


    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

  從上邊能夠發現一個特別,若是想對POST方法也進行認證,就須要在post函數上再加裝飾器,若是有六七種方法,那麼無疑須要六七種裝飾器,是很麻煩的, 所以能夠利用dispatch方法來進行驗證,利用了全部的class都會執行dispatch方法的特性

from django import views

class Order(views.View):

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

    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

  某些人可能在想了,這樣還得寫一個dispatch函數,而實際上dispatch函數內容什麼也都沒變,那麼有沒有更加簡便的方法,最終版看以下:

from django import views
from django.utils.decorators import method_decorator

@method_decorator(auth,name='dispatch')
class Order(views.View):
    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})
相關文章
相關標籤/搜索