CBV
简介:使用 Class 取代原来的 def 在django中做视图的处理。(FBV就是我们经常使用的用def处理视图函数)
需要提前导入
from django import views from django.utils.decorators import method_decorator
dispath: 是view.View 中的一个分发器,主要功能是根据request.header.method的不同来选择不同的方法处理视图。
优点: 逻辑较为清晰
可以做到一次性对多个方法添加装饰器(有分发器都可以)
一:project
----------------------------------------------urls
from item import views as item_views
urlpatterns = [
url(r'^item_login/$',item_views.Login.as_view()),
]
二:app<-item
----------------------------------------------views1
使用装饰器,对方法添加操作,每一个方法都需要添加一个装饰器
from django import views
from django.utils.decorators import method_decorator
def outer(child): # 将被路由器装饰的方法传入。名称为 child(可自己命名)执行步骤1
def process(request, *args, **kargs): # 获取参数 执行步骤2
print('先走这一步, 拿到传来的参数') 执行步骤3
return child(request, *args, **kargs) # 执行被装饰的方法 执行步骤4
return process 执行步骤5
'''
需要注意的是 步骤1虽然拿到了被装饰的方法,但是却没有做任何操作。
但也仅仅是拿到方法而已。
'''
class Login(views.View):
@method_decorator(outer) #装饰器的使用方法
def get(self, request, *args, **kwargs):
print(request.method, 'ggggggg')
obj = render(request, "item_login.html", {"message":''})
return obj
@method_decorator(outer) #装饰器的使用方法
def post(self, request, *args, **kwargs):
print(request.method)
username = request.POST.get("user")
password = request.POST.get("pwd")
user = item_models.Administrator.objects.filter(username = username, password = password).count()
print(user)
if user:
request.session['is_log'] = True
request.session['username'] = username
rep = redirect("/item_index/")
return rep
else:
message = '用户名或密码错误'
obj = render(request, "item_login.html", {"message": message})
return obj
----------------------------------------------views2
使用 view.View(父类)中的dispatch(重写dispatch)方法替代装饰器
优点 与装饰器功能相同,而且只需要写一次
from django import views
from django.utils.decorators import method_decorator
class Login(views.View):
# @method_decorator(outer)
def dispatch(self, request, *args, **kwargs):
print('在执行post或get之前进行操作,可以替代装饰器')
rep = super(Login, self).dispatch(request, *args, **kwargs) #执行方法
print('在执行post或get后进行操作')
return rep #返回
def get(self, request, *args, **kwargs):
print(request.method, 'ggggggg')
obj = render(request, "item_login.html", {"message":''})
return obj
def post(self, request, *args, **kwargs):
print(request.method)
username = request.POST.get("user")
password = request.POST.get("pwd")
user = item_models.Administrator.objects.filter(username = username, password = password).count()
print(user)
if user:
request.session['is_log'] = True
request.session['username'] = username
rep = redirect("/item_index/")
return rep
else:
message = '用户名或密码错误'
obj = render(request, "item_login.html", {"message": message})
return obj
----------------------------------------------views3
现在的需求是,我在执行post 或者get 或者其他方法请求时需要验证是否登录。
方法一: 使用dispatch 参考views2
方法二:使用路由 参考views1
方法三:dispatch + 路由
写法1:
class Login(views.View):
@method_decorator(outer)
def dispatch(self, request, *args, **kwargs):
rep = super(Login, self).dispatch(request, *args, **kwargs) #执行方法
return rep #返回
写法2:
@method_decorator(outer,name=dispatch)
class Login(views.View):
def dispatch(self, request, *args, **kwargs):
rep = super(Login, self).dispatch(request, *args, **kwargs) #执行方法
return rep #返回