程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Django的FBV和CBV

发布于2019-08-07 19:23     阅读(658)     评论(0)     点赞(1)     收藏(4)


FBV : function base views,  就是在视图里使用函数处理请求。

复制代码
urlpatterns = [
    path('index/', views.index),
]


# 视图函数里
def index(request):
    return render(request,"index.html")
复制代码

CBV : class base views,  就是在视图里使用类处理请求。

复制代码
urlpatterns = [
    path("login/",views.LoginView.as_view())
]


# 视图函数里
class LoginView(View):

    def dispatch(self, request, *args, **kwargs):
        """
        重写dispatch方法, 可以放一些专属于LoginView的操作
        """
        return ...

    def get(self,request):
        return HttpResponse("OK")

    def post(self,request):
        return HttpResponse("OK")

    def put(self,request):
        return HttpResponse("OK")

    def delete(self,request):
        return HttpResponse("OK")
复制代码

CBV的源码剖析: 

  Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view(即Django的基础View类)提供了一个 as_view()  的静态方法(也就是类方法),调用这个方法,会通过  self = cls(**initkwargs)  创建一个类的实例,然后通过实例调用 dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。

为什么要有CBV这种模式? 

  python的一大重要的特性就是面向对象。而cbv更能体现python的面向对象。cbv是通过class的方式来实现视图方法的。class相对于function,更能利用多态的特定(多态: 可对不同类的对象使用同样的操作),因此更容易从宏观层面上将项目内的比较通用的功能抽象出来。

 



所属网站分类: 技术文章 > 博客

作者:磨子舒

链接:https://www.pythonheidong.com/blog/article/12373/c7858bb7e30c80fa16bd/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)