类视图引入
以函数的形式进行定义的视图就是函数视图,视图函数便于理解,但是遇到一个视图函数对应的路径提供了多种不同的HTTP请求方式的支持时(get,post,delete,put),需要在一个函数中写不同的业务逻辑,代码的可读性和复用性就很底低,所以,我们引入类视图进行解决。
下面是视图函数的例子
[Python]
纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
|
def
register(request):
"""处理注册"""
# 获取请求方法,判断是GET/POST请求
if
request.method
=
=
'GET'
:
# 处理GET请求,返回注册页面
return
render(request,
'register.html'
)
else
:
# 处理POST请求,实现注册逻辑
return
HttpResponse(
'这里实现注册逻辑'
)
|
类视图的优点
代码可读性好
类视图相对于函数视图有更高的复用性,如果其他地方需要使用到某个类的某个特定方法,直接继承该类的视图就可以了
类视图的定义
根据不同的请求方式在类视图里面定义不同的处理函数
定义类视图需要继承自的Django提供的父类的View
[Python]
纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
from
django.views.generic
import
View
class
DefineClassview(View):
"""演示类视图的定义和使用"""
def
get(
self
, request):
"""处理GET请求业务逻辑"""
return
HttpResponse(
'GET请求业务逻辑'
)
def
post(
self
, request):
"""处理POST请求业务逻辑"""
return
HttpResponse(
'POST请求业务逻辑'
)
def
put(
self
, request):
"""处理PUT请求业务逻辑"""
return
HttpResponse(
'PUT请求业务逻辑'
)
def
delete(
self
, request):
"""处理DELETE请求业务逻辑"""
return
HttpResponse(
'DELETE请求业务逻辑'
)
|
配置url:调用类视图的as_view()函数
注意:as_view() 函数继承于父类View
[Python]
纯文本查看 复制代码
1
2
3
4
5
6
|
urlpatterns
=
[
# 视图函数:注册
# url(r'^register/$', views.register, name='register'),
# 类视图:注册 as_view()可以将类视图转换成视图,并决定如何分发请求
url(r
'^register/$'
, views.RegisterView.as_view(), name
=
'register'
),
]
|
类视图实现原理
通过下面源码,我们可以看到as_view() 函数里面的定义一个view() 函数,并且返回view。
我们再看view() 函数,里面调用了dispatch() 函数,dispatch() 函数的作用是按照不同请求方式调用不同请求方法。
[Python]
纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@classonlymethod
def
as_view(
cls
,
*
*
initkwargs):
"""
Main entry point for a request-response process.
"""
...省略代码...
def
view(request,
*
args,
*
*
kwargs):
self
=
cls
(
*
*
initkwargs)
if
hasattr
(
self
,
'get'
)
and
not
hasattr
(
self
,
'head'
):
self
.head
=
self
.get
self
.request
=
request
self
.args
=
args
self
.kwargs
=
kwargs
# 调用dispatch方法,按照不同请求方式调用不同请求方法
return
self
.dispatch(request,
*
args,
*
*
kwargs)
...省略代码...
# 返回真正的函数视图
return
view
def
dispatch(
self
, request,
*
args,
*
*
kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if
request.method.lower()
in
self
.http_method_names:
handler
=
getattr
(
self
, request.method.lower(),
self
.http_method_not_allowed)
else
:
handler
=
self
.http_method_not_allowed
return
handler(request,
*
args,
*
*
kwargs)
|
更多技术资讯可关注:gzitcast