• 方法实现django classbased views介绍与分析


    时间紧张,先记一笔,后续优化与完善。

               class-based views是django从1.3版本引入的一种新的特性,就是应用类的形式来描述view。class-based views对django带来的不只是编程方法的改变,而是程序计划哲学的改变。Django在最开始的计划的时候利用函数的方式来实现view,这种方式也是利用了python的动态语言特性,可以说是python’s 的编程方式。现在引入了class-based views的方式,很多人以为他太过于庞杂,并且这种方式是no python’s。我对于这些说法是持保存立场的,首先python是一种面向对象的语言,利用class-based views的方式可以充分利用面向对象的优点,我在这里要夸大的一点是python他不只是一种脚本语言,他完全可以构建大型的应用,并且这已经是事实(如openstack)。class-based views现实起到的作用不是使程序变得庞杂了,恰恰相反他使程序的变得简略。他可以将一些公用的东西抽象出来,供别的类继承应用,减少了大量的重复的单调的冗余的代码编写工作。

              class-based views的庞杂只是存在于去接受他理解他,刚开始应用可能认为有些不适应,等渐渐对他有了深刻的理解就会渐渐领会到他的好处。对于class-based views的学习其实也不是很庞杂,虽然中文资料很少,但是官方文档还是有较为具体的分析。我以为最好的学习方法还是去读他的相干的源代码。其实他本身的源码量不是很多,如果硬着头皮去读完全可以读懂的。

               各种class-based views的实现都是通过继承view这个基类然后再mixin各种实现相干功能的mixin class。Mixin是利用python的多继承的特性,这些Mixin class都是为view服务的不该独自应用。

        

    django自带的Mixins

        通常情况下你并不需要直接用到这些Mixin,但你需要知道自己应用的Generic view继承了哪些Mixin,以便进行扩展。

        ·        SingleObjectMixin(单对象类)

        ·        MultipleObjectMixin(多对象类)

        ·        TemplateResponseMixin(模板响应类)

        ·        FormMixin(表单类)

        ·        YearMixin, MonthMixin,DayMixin, WeekMixin, DateMixin(几个基于时间关系的类)

        

    django自带的generic views

           TemplateView渲染指定的模板

            RedirectView重定向

           DetailView 察看对象具体信息

           ListView 显示对象列表

           Editing views 实现编辑

           FormView 显示Form

           CreateView 创建对象

           UpdateView 更新对象

           DeleteView 删除对象

             

              http://akonizo.com/ 中有具体的类视图。

        

               在实现自己的可重用views时,可从上面的类继承,并可以通过增加自定义Mixin的方式进行功能扩展,openstack的horizon就是通过继承generic.TemplateView实现了了几种自定义的view类型,然后被各现实页面继承应用。

                View中最主要的两个方法就是get和post,他们现实对应http的get和post方法,在执行http的get或post请求时被现实调用。as_view非常主要他是处置现实的 request-response 过程的接入点,在urls.py中现实调用 url(r'^$',TemplateListView.as_view(), name='poject-list'),了as_view方法

        每日一道理
    微笑,是春天里的一丝新绿,是秋日里的一缕阳光,是骄阳下的一片浓荫,是冬雪中的一株梅红……微笑着去面对吧,你会感到人生是那样的温馨与甜蜜!
    @classonlymethod
        def as_view(cls, **initkwargs):
            """
            Main entry point for a request-response process.
            """
            # sanitize keyword arguments
            for key in initkwargs:
                if key in cls.http_method_names:
                    raise TypeError(u"You tried to pass in the %s method name as a "
                                    u"keyword argument to %s(). Don't do that."
                                    % (key, cls.__name__))
                if not hasattr(cls, key):
                    raise TypeError(u"%s() received an invalid keyword %r" % (
                        cls.__name__, key))
    
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)
                if hasattr(self, 'get') and not hasattr(self, 'head'):
                    self.head = self.get
                return self.dispatch(request, *args, **kwargs)
    
            # take name and docstring from class
            update_wrapper(view, cls, updated=())
    
            # and possible attributes set by decorators
            # like csrf_exempt from dispatch
            update_wrapper(view, cls.dispatch, assigned=())
            return view

        dispatch方法时现实调用前边所说的post,get方法

    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
            self.request = request
            self.args = args
            self.kwargs = kwargs
            return handler(request, *args, **kwargs)

        

        这里利用了python的动态语言的一个比较常见的技巧,用handler=getattr(self, request.method.lower(), self.http_method_not_allowed)失掉方法名,handler(request, *args, **kwargs)现实执行方法,handler的值多是post或get,实现了http的名字和view中方法名对应。其实熟习http的朋友可能都知道,不止有post,get方法还有 'put', 'delete', 'head', 'options', 'trace'等方法。但是class view中了post,get方法比较常用就以这连个方法作为阐述的例子,当然你可以根据需求实现put,delete等方法道理是和post,和get完全一样的。

              读懂class view的前提是你对django的,先关基础知识比较熟习。所以对于django初学者的提议是先从基础的学起。

    文章结束给大家分享下程序员的一些笑话语录:  一边用着越狱的ip,一边拜乔帮主的果粉自以为是果粉,其实在乔帮主的眼里是不折不扣的叛徒。

  • 相关阅读:
    脚本性能分析
    openwrt补丁
    定制openwrt的根文件
    openwrt路由器更换了Flash之后需要修改的源码
    openwrt驱动与应用程序的联系
    我的vi/vim配置文件
    Python中的字典分组函数(groupby,itertools)
    迭代器
    tuple
    list
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3084532.html
Copyright © 2020-2023  润新知