Django类视图详解

类视图引入
       以函数的形式进行定义的视图就是函数视图,视图函数便于理解,但是遇到一个视图函数对应的路径提供了多种不同的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

猜你喜欢

转载自www.cnblogs.com/heimaguangzhou/p/11689916.html