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
#
返回