zoukankan      html  css  js  c++  java
  • django 架构点点滴滴

    前言:

    零星发现一些,零星记录一些,因此可能整体比较混乱,因为显然不是一气呵成写的。

    关于CBV(Class Based View):

    首先吐槽下,cbv的整体继承结构,可真的不是很优美,可以查看这里

    好吧,但分开来看,还是可圈可点的。

    1. 比如SingleTemplateResponseMixin,有一个属性template_name_field(不太喜欢翻看文档,发现一段文档看完的时间可以看完好多code,相当于好多页的文档; 如有雷同,实属巧合。)

     看看get_template_names, 这个才是这个类的目的,重写其模板命名以及路径逻辑。(由于源码注释较多,砍掉了,精简版如下)

    class SingleObjectTemplateResponseMixin(TemplateResponseMixin):
        template_name_field = None
        template_name_suffix = '_detail'
    
        def get_template_names(self):
            try:
                names = super(SingleObjectTemplateResponseMixin, self).get_template_names()
            except ImproperlyConfigured:
                names = []
                
                if self.object and self.template_name_field:
                    name = getattr(self.object, self.template_name_field, None)
                    if name:
                        names.insert(0, name)
    
                if isinstance(self.object, models.Model):
                    names.append("%s/%s%s.html" % (
                        self.object._meta.app_label,
                        self.object._meta.model_name,
                        self.template_name_suffix
                    ))
                elif hasattr(self, 'model') and self.model is not None and issubclass(self.model, models.Model):
                    names.append("%s/%s%s.html" % (
                        self.model._meta.app_label,
                        self.model._meta.model_name,
                        self.template_name_suffix
                    ))
    
                if not names:
                    raise
    
            return names
    

    注意11~14行,如果有定义这个字段,这从对象中取出这个字段的值。

    这意味着: 对于每一个数据行,都可以使用一个独特的模板!想象下,每一篇文章,都有一个属于自己的主题!好吧,的确很牛掰的设计。

    此处留名。

    2. 关于模板的渲染。不管你是用django.shortcuts.render/render_to_response 还是用用TemplateResponseMixin的render,最后你会发现最终调用的render就是在settings中定义的template_loaders之中的loader的render方法。

    好吧,很牛逼,我们只要管在哪找模板,和定义这个template_loaders(要大写哦), 就可以搞定渲染的机制。详细代码由于涉及内容过多,此处不列举分析。

    3. 第三,这个跟django无关,跟python有关。发现python的__dict__有很大文章,简直无所不能,好吧,这里水很深。举个简单应用的比方:可以把桃子的树枝放在苹果树上生长,仍然长出桃子。(有点混乱)。

  • 相关阅读:
    Path Sum
    Linked List Cycle II
    Linked List Cycle
    Single Number i and ii
    Binary Tree Preorder Traversal and Binary Tree Postorder Traversal
    Max Points on a Line
    Evaluate Reverse Polish Notation
    【leetcode】98 验证二叉搜索树
    【vivo2020春招】 02 数位之积
    【vivo2020春招】03 vivo智能手机产能
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/4000299.html
Copyright © 2011-2022 走看看