062.Python前段框架Django视图CBV

2021-03-05 11:30

阅读:643

YPE html>

标签:cts   messages   mit   pes   NPU   width   get   short   html   

 


回到顶部

一 CBV与FBV

  • CBV:Class Based View
  • FBV:Function Based View
  • 之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的,那就是CBV。

1.1 创建项目

root@darren-virtual-machine:~/PycharmProjects# django-admin startproject cbv_test

root@darren-virtual-machine:~/PycharmProjects# cd cbv_test/

root@darren-virtual-machine:~/PycharmProjects/cbv_test# python3 manage.py startapp app01

setting注册app

技术图片
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘app01.apps.App01Config‘,
]
技术图片

root@darren-virtual-machine:~/PycharmProjects/cbv_test# mkdir templates

root@darren-virtual-machine:~/PycharmProjects/cbv_test# vim cbv_test/settings.py

技术图片
TEMPLATES = [
    {
        ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
        ‘DIRS‘: [os.path.join(BASE_DIR,"templates")],
        ‘APP_DIRS‘: True,
        ‘OPTIONS‘: {
            ‘context_processors‘: [
                ‘django.template.context_processors.debug‘,
                ‘django.template.context_processors.request‘,
                ‘django.contrib.auth.context_processors.auth‘,
                ‘django.contrib.messages.context_processors.messages‘,
            ],
        },
    },
]
技术图片

路由分发

技术图片
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘app01/‘,include(app01.urls)),
]
技术图片

配置一个登录页面

技术图片
Title

用户登录

{% csrf_token %}

用户名:

密 码:

技术图片

url文件

技术图片
from django.urls import  path,re_path
from app01 import views

urlpatterns = [
    path(‘login/‘,views.login),
]
技术图片

views视图文件

技术图片
from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request,"login.html")
技术图片

访问

技术图片

1.2 使用CBV改写

urls文件

技术图片
from django.urls import  path,re_path
from app01 import views

urlpatterns = [
    path(‘login_fbv/‘,views.login),
    path(‘login_cbv/‘, views.Login.as_view()),
]
技术图片

views文件

技术图片
from django.shortcuts import render,redirect,HttpResponse
from django.views import  View

# Create your views here.
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request,"login.html")


#CBV
class Login(View):
    def get(self,request):
        return render(request, "login.html")
    def post(self,request):
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request, "login.html")
技术图片

访问http://127.0.0.1:8000/app01/login_cbv/登录

技术图片

FBV本身就是一个函数,所以和给普通的函数加装饰器无差

1.3 使用装饰器装饰CBV

给CBV加装饰器

技术图片
from django.shortcuts import render,redirect,HttpResponse
from django.views import  View
import  time

# Create your views here.

def timer(func):
    def inner(request,*args,**kwargs):
        start_time = time.time()
        time.sleep(2)
        rep = func(request,*args,**kwargs)
        end_time = time.time()
        print (end_time-start_time)
        return rep
    return inner

#FBV
@timer
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request,"login.html")
技术图片

1.4 使用装饰器装饰FBV

类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。

1.4.1 给某个方法加上装饰器

此例给get方法加上)

技术图片
from django.shortcuts import render,redirect,HttpResponse
from django.views import  View
import  time
from django.utils.decorators import method_decorator
# Create your views here.

def timer(func):
    def inner(request,*args,**kwargs):
        start_time = time.time()
        time.sleep(2)
        rep = func(request,*args,**kwargs)
        end_time = time.time()
        print (end_time-start_time)
        return rep
    return inner

#FBV
@timer
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request,"login.html")


#CBV
class Login(View):
    @method_decorator(timer)
    def get(self,request):
        return render(request, "login.html")
    def post(self,request):
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request, "login.html")
技术图片

访问http://127.0.0.1:8000/app01/login_cbv/,只有get有,post并没有用到装饰器

[10/Apr/2020 11:27:53] "GET /app01/login_cbv HTTP/1.1" 301 0
2.024909496307373
[10/Apr/2020 11:27:55] "GET /app01/login_cbv/ HTTP/1.1" 200 456
[10/Apr/2020 11:28:05] "POST /app01/login_cbv/ HTTP/1.1" 200 16

1.4.2 加在dispatch方法上面

会给类下的所有方法加上此装饰器

技术图片
from django.shortcuts import render,redirect,HttpResponse
from django.views import  View
import  time
from django.utils.decorators import method_decorator
# Create your views here.

def timer(func):
    def inner(request,*args,**kwargs):
        start_time = time.time()
        time.sleep(2)
        rep = func(request,*args,**kwargs)
        end_time = time.time()
        print (end_time-start_time)
        return rep
    return inner

#FBV
@timer
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request,"login.html")


#CBV
class Login(View):
    @method_decorator(timer)
    def dispatch(self, request, *args, **kwargs):
        obj = super().dispatch(request,*args,**kwargs)
        return obj     #这里必须返回,否则Httpresponse错误
    #@method_decorator(timer)
    def get(self,request):
        return render(request, "login.html")
    def post(self,request):
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request, "login.html")
技术图片

访问http://127.0.0.1:8000/app01/login_cbv

[10/Apr/2020 11:35:08] "GET /app01/login_cbv/ HTTP/1.1" 200 456
2.01680588722229
2.00297474861145
[10/Apr/2020 11:35:16] "POST /app01/login_cbv/ HTTP/1.1" 200 16

1.4.3加在类上面

技术图片
from django.shortcuts import render,redirect,HttpResponse
from django.views import  View
import  time
from django.utils.decorators import method_decorator
# Create your views here.

def timer(func):
    def inner(request,*args,**kwargs):
        start_time = time.time()
        time.sleep(2)
        rep = func(request,*args,**kwargs)
        end_time = time.time()
        print (end_time-start_time)
        return rep
    return inner

#FBV
@timer
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "joy" and password == "123456":
            return HttpResponse("login success...")
        else:
            return render(request,"login.html")


#CBV
@method_decorator(timer,name="get")
#如果需要给post方法家装饰器,method_decorator(timer,nmae="post"),必须制定name的值,否则报错

class Login(View): #@method_decorator(timer) def dispatch(self, request, *args, **kwargs): obj = super().dispatch(request,*args,**kwargs) return obj #这里必须返回,否则Httpresponse错误 #@method_decorator(timer) def get(self,request): return render(request, "login.html") def post(self,request): username = request.POST.get("username") password = request.POST.get("password") if username == "joy" and password == "123456": return HttpResponse("login success...") else: return render(request, "login.html")

技术图片

访问http://127.0.0.1:8000/app01/login_cbv/

2.017592191696167
[10/Apr/2020 11:39:04] "GET /app01/login_cbv/ HTTP/1.1" 200 456
[10/Apr/2020 11:39:10] "POST /app01/login_cbv/ HTTP/1.1" 200 16

在给类加装饰器的时候,也可以使用name=dispatch,也可以,关键是必须有这个类存在

062.Python前段框架Django视图CBV

标签:cts   messages   mit   pes   NPU   width   get   short   html   

原文地址:https://www.cnblogs.com/wangsirde0428/p/14322935.html


评论


亲,登录后才可以留言!