Django的CBV方式讲解

简介:

CBV使用配置

路径url的配置

cbv 顾名知义就是通过类的方法来调用,我们在url中配置为如下路径

 url(r'^cbv.html/', views.Cbv.as_view()),

这里的Cbv是一个class 类,要想使用cbv方法,这个路径后面还得必须有一个as_view()这个是必须的固定格式

views里面函数的格式

在views里面配置类,需要导入一个模块

from django.views.generic import View #这个是导入的模块,原来的django版本从django.views 里面可以直接导入View,但是现在需要加一个generic才可以
class Cbv(View): #这里必须要继承View这个类,只有继承了这个url那里的as_view()才会有这个方法
    def get(self,request):
        return HttpResponse('cbv-get')

    def post(self,request):
        return HttpResponse('cbv-post')

浏览器get方式访问

Django的CBV方式讲解

创建一个login登陆页面测试post方法

views配置
from django.views.generic import View
class Cbv(View):
    def get(self,request):
        # return HttpResponse('cbv-get')
        return render(request,'login.html') #发送到login.html
    def post(self,request):
        return HttpResponse('cbv-post')

login的页面配置代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cbv学习</title>
</head>
<body>
<form action="/cbv.html/" method="post">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>

</body>
</html>

浏览器访问查看点击提交后的结果

Django的CBV方式讲解

点击提交
Django的CBV方式讲解

这里通过查看View的源码,可以看到里面会有很多种提交方法
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
使用ajax的时候这些方法都是可以使用的。

另外继承类不光有View,还有很多的,查看源码就可以看到的
Django的CBV方式讲解

我的django版本号是
C:\Users\Tony>python3 -m django --version
1.9.13

cbv匹配原理

这种更具url来匹配方法的是通过反射方法(getattr)来做的。请求过来后先走dispatch这个方法,这个方法存在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)

定制dispatch

如果需要批量对方法,例如get,post等方法做一些操作的时候,这里我们可以手动写一个dispatch,这个dispatch就和装饰器的效果一样。因为请求来的时候总是先走的dispatch。

from django.views.generic import View
class Cbv(View):
    def dispatch(self, request, *args, **kwargs):
        print('操作前的操作')
        obj = super(Cbv,self).dispatch(request, *args, **kwargs)
        print('操作后的操作代码')
        return obj

    def get(self,request):
        # return HttpResponse('cbv-get')
        return render(request,'login.html')
    def post(self,request):
        return HttpResponse('cbv-post')

这次我们在通过浏览器访问的时候,发现不管get或者post方法,都会走print代码,
Django的CBV方式讲解




本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/2061658,如需转载请自行联系原作者

相关文章
|
6月前
|
Go 调度 Python
Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法
Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法
Django-视图CBV执行流程详解
FBV和CBV其实就是要么写函数要么写类,那么内部原理是怎么实现? FBV写法 def func_view(request): "Function views" if request.
1563 0
|
JSON 数据格式 Python
Django之CBV
CBV,即Class Base View,类基本视图。 在写API时,我们通常都是使用CBV,而非FBV (Function Base View)。 1.
1540 0
|
Web App开发 Go Python
源码解析Django CBV的本质
Django CBV模式的源码解析 通常来说,http请求的本质就是基于Socket Django的视图函数,可以基于FBV模式,也可以基于CBV模式。 基于FBV的模式就是在Django的路由映射表里进行url和视图函数的关联,而基于CBV的模式则是在views.
1427 0
第05章节-Python3.5-Django的CBV和FBV 4
4. FBV & CBV function base view url.py index -> 函数名 view.py def 函数(request): .
1348 0
|
数据安全/隐私保护 Python
|
Python
如何在DJANGO里获取?带数据的东东,基于CBV
用DEF的,有现成的,而用CLASS的,就要作一下变通。 如下: if self.request.GET: if self.request.GET.get('search_pk'): search_pk = self.
977 0