062.Python前段框架Django视图CBV
2021-03-05 11:30
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 用户登录
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
上一篇:064.Python开发虚拟环境
下一篇:链表归并排序