Django-CBV和FBV

CBV

# urls.py
from django.conf.urls import url
from django.contrib import admin
from cbv import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^Login.html$', views.Login.as_view()),
]
# views.py
from django.views import View

class Login(View):

""""
getpost 提交 創建
put 更新
delete 刪除
""""


    def get(self,request):
        return HttpResponse('Login...get')

    def post(self,request):
        user = request.POST.get('user')
        print(user)
        return HttpResponse('Login...post')

  • dispatch 類似於裝飾器的效果
# views.py

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
from django.views import View

class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj


    def get(self,request):
        return HttpResponse('Login...get')

    def post(self,request):
        user = request.POST.get('user')
        print(user)
        return HttpResponse('Login...post')

  • 給CBV加裝飾器

在指定方法上裝

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
from django.views import View
from django.utils.decorators import method_decorator
import time


def auth(func):
    def wrapper(*args,**kwargs):
        print(time.time())
        return func(*args,**kwargs)
    return wrapper



class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj

    @method_decorator(auth)
    def get(self,request):
        return HttpResponse('Login...get')

    @method_decorator(auth)
    def post(self,request):
        user = request.POST.get('user')
        print(user)
        return HttpResponse('Login...post')

在類上加

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
from django.views import View
from django.utils.decorators import method_decorator
import time


def auth(func):
    def wrapper(*args,**kwargs):
        print(time.time())
        return func(*args,**kwargs)
    return wrapper


# @method_decorator(auth,name='get')
@method_decorator(auth,name='dispatch')
class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj


    def get(self,request):
        return HttpResponse('Login...get')


    def post(self,request):
        user = request.POST.get('user')
        print(user)
        return HttpResponse('Login...post')

*Django 中 的一個bug,csrf_protect裝飾器只能在類上添加

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
import time


def auth(func):
    def wrapper(*args,**kwargs):
        print(time.time())
        return func(*args,**kwargs)
    return wrapper


@method_decorator(csrf_protect,name='get')
class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj


    def get(self,request):
        return HttpResponse('Login...get')


    def post(self,request):
        user = request.POST.get('user')
        print(user)
        return HttpResponse('Login...post')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章