`
marlonyao
  • 浏览: 252806 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

再一个用于调试Django模板的标签

阅读更多
主要用于在Html中递归输出对象的属性,这对调试Django相当有用。

用法:
{% inspect object %}



实现:
from django import template
import re
register = template.Library()

def do_inspect(parser, token):
    try:
        tag_name, var_name = token.split_contents()
    except ValueException:
        msg = '%r tag requires a single parameter' % token.split_contents()[0]
        raise template.TemplateSyntaxError(msg)
    return DumpVarNode(var_name)

import types
method_types = (types.BuiltinFunctionType, types.BuiltinMethodType, types.MethodType, types.FunctionType,)

from django.utils.html import escape
class DumpVarNode(template.Node):
    def __init__(self, var_name):
        self.var_name = var_name
        self.var = template.Variable(var_name)
        self._objects = []     # contains travased objects

    def render(self, context):
        var_value = self.var.resolve(context)
        html = '''
<script>
    if (!window.jQuery) {
        document.write('<scrip' + 't src="http://code.jquery.com/jquery-1.4.2.js" type="text/javascript"></sc' + 'ript>');
    }
</script>
<script>
(function($) {
    $(function() {
        $('.djt_var_head').click(function() {
            $('.djt_display_area textarea').val($(this).find('.djt_var_detailed').text())
        });
        $('.djt_exp').click(function() {
            $(this).closest('.djt_var_head').find('+ .djt_var_body').toggle();
            var expcol = $(this).toggleClass('djx_expanded');
            if (expcol.hasClass('djx_expanded')) {
                expcol.html('-');
            } else if (varBody.length > 0) {
                expcol.html('+');
            }
        })
    });
})(jQuery);
</script>
<style type="text/css">
    .djt_render {
        font-family: monospace;
        color: #333;
        line-height: 150%;
    }
    .djt_var_name {
        color: #000;
    }
    .djt_var_value {
        color: #666;
    }
    .djt_var_body {
        padding-left: 2em;
    }
    .djt_type_type {
        color: #00681C;
        font-weight: bold;
    }
    .djt_type_str, .djt_type_int, .djt_type_long, .djt_type_float, .djt_type_bool {
        color: #3333CC;
        font-weight: bold;
    }
    .djt_type_instance {
        color: #256;
        font-weight: bold;
    }
    .djt_var_id {
        /*color: blue;*/
    }
</style>'''
        html += '<div class="djt_render">'
        html += self._render_var(self.var_name, var_value, expand_props=True)
        html += '<div class="djt_display_area"><textarea rows="10" cols="80"></textarea></div>'
        html += '</div>'
        return html

    def _render_var(self, var_name, var_value, expand_props=False):
        already_exists = any([var_value is x for x in self._objects])
        self._objects.append(var_value)

        props = self.get_var_props(var_value)
        html = '<div class="djt_var">\n'
        html += self._render_var_head(var_name, var_value, props, expand_props, exists=already_exists)
        html += self._render_var_body(var_value, props, expand_props, exists=already_exists)
        html += '</div>'
        return html

    def _render_var_head(self, var_name, var_value, props, expand_props = False, exists=False):
        html = '<div class="djt_var_head">'
        if not exists:
            html += '<a name="djt_%s"></a>' % id(var_value)
        expanded = len(props) == 0 or exists or expand_props
        html += '''\
                    <span class="djt_exp %s">%s</span>
                    <span class="djt_var_name">%s:</span>
                    <span class="djt_var_value djt_type_%s">%s</span>
                    %s
                    <div class="djt_var_detailed" style="display:none">%s</div>
                </div>''' % (
            'djx_expanded' if expanded else '',
            '-' if expanded else '+',
            escape(var_name),
            self._value_type(var_value),
            self._str_value(var_value),
            self._render_return_link(var_value) if exists else '',
            self._detailed_str(var_value),
        )
        return html

    def _render_return_link(self, var):
        return '<a class="djt_jumplink" href="#djt_%s">here<a/>' % id(var)

    def _render_var_body(self, var_value, props, expand_props = False, exists=False):
        if len(props) == 0 or exists: return ''

        html = '<div class="djt_var_body" %s>' % ('' if expand_props else 'style="display:none"')
        for prop_name, prop_value in props:
            html  += self._render_var(prop_name, prop_value)
        html += '</div>'
        return html

    def _value_type(self, var):
        if var is None:
            return 'none'
        if type(var) in (bool, int, long, float, str, type):
            return type(var).__name__
        if type(var) in (unicode,):
            return 'str'
        return 'instance'
    
    def _detailed_str(self, var):
        tmp = '''\
type: %s
bases: %s
id: %s
str: "%s"
repr: %r
''' % (
    type(var).__name__, type(var).__bases__, id(var),
    var, var, 
)
        return escape(tmp)

    def get_var_props(self, var_value):
        if isinstance(var_value, (int, long, bool, float, str, unicode)):
            return []
        if isinstance(var_value, method_types):
            return []

        props = []
        for prop in dir(var_value):
            if prop.startswith('_'):
                continue
            try:
                prop_value = getattr(var_value, prop)
                # ingore builtin type
                if isinstance(prop_value, method_types):
                    continue

                props.append( (prop, prop_value) )
            except Exception, e:
                props.append( (prop, e) )  # TODO: indicator as error

        return props
    def _str_value(self, val):
        if isinstance(val, (bool, int, long, str, float)):
            strval = repr(val)
        elif isinstance(val, unicode):
            strval = repr(val)[1:]
        elif isinstance(val, (list, tuple, dict)):
            strval = str(val)
        else:
            try:
                strval = val.__class__.__name__
            except:
                strval = 'error occured'
        return escape(str(strval))

register.tag('inspect', do_inspect)

分享到:
评论

相关推荐

    python-django模板

    8. **模板调试**:Django提供了一个强大的模板错误报告系统,它会在出错时显示详细的错误信息,帮助开发者快速定位问题。 综上所述,Django模板是构建动态Web应用的核心组件。通过熟练掌握模板语言,开发者能有效地...

    Python一日一练---Django模版练习源码

    3. **模板继承**:Django模板支持模板继承,这意味着你可以创建一个基础模板,包含通用布局和部分,然后其他模板可以继承这个基础模板,只覆盖特定的部分,提高代码复用性和维护性。 4. **模板标签**:如`{% for %}...

    6. Django 深入模板

    - **include标签**:允许将一个模板包含到另一个模板中,通常用于复用小段代码。 4. **过滤器** - **过滤器**是用于修改变量值的函数,如`|capfirst`用于首字母大写,`|length`返回序列长度。过滤器可以通过管道...

    django3.2模板

    - Django REST framework 是一个强大的工具,用于构建 RESTful API。 - 它与 Django 模板系统紧密集成,提供 JSON 模板渲染和自定义响应类。 - 使用 `rest_framework.renderers.JSONRenderer` 可以将数据渲染为 ...

    python django

    在 Django 模板引擎中,block 是一个基本的标签,用于定义一个块,该块可以被子模板覆盖。使用 block 标签可以将模板拆分成多个小块,每个块可以单独维护和更新。例如: ```html &lt;!-- base.html --&gt; {% block ...

    分享:集成了Django1.0 的Google App Engine开发 模板项目

    它表明我们有一个特定的项目模板,该模板结合了两个重要的技术:Django 1.0 和 Google App Engine。Django是一个广泛使用的Python Web框架,用于快速开发和清洁、实用的设计。而Google App Engine则是一个平台即服务...

    Django10个使用技巧

    Django是一个高效的Python web框架,以其遵循DRY(Don't Repeat Yourself)原则和高度可重用组件而闻名。以下是从标题和描述中提取的10个Django使用技巧,这些技巧可以帮助开发者更高效地使用Django进行开发。 1. *...

    django简易版网盘

    【标题】"django简易版网盘"所涉及的知识点主要集中在使用Django框架构建一个基本的文件存储系统,它提供了用户注册、登录、文件上传和下载的功能。Django是Python Web开发的一个强大框架,以其MVT(Model-View-...

    django2.0英文版

    Django模板语言(DTL)允许设计者和开发者将逻辑代码与展示代码分离。模板可以调用变量来展示数据,使用标签和过滤器来控制内容的显示方式,还可以包含子模板来避免重复代码。 5. 表单处理(Forms) Django的表单...

    Django 1.0 Template Development

    模板缓存是Django模板系统中的一个重要特性,它可以帮助提高网站性能。通过将经常变化的内容与较少变化的部分分开,并对后者进行缓存,可以显著减少服务器负载并加快页面加载速度。书中详细解释了如何设置和使用模板...

    Django开发文档

    - **项目创建**: 使用 `django-admin startproject` 命令快速创建一个新的 Django 项目。 **1.3 模型层** - **数据模型定义**: 在 Django 中,通过定义 Python 类来表示数据库表结构。 - **迁移管理**: 使用 ...

    django国际化document

    Django 是一个用 Python 编写的开源 Web 开发框架,它以其“ Batteries Included ”(内置功能丰富)的理念而著名。在开发多语言网站时,Django 提供了强大的国际化(i18n,internationalization)和本地化(l10n,...

    python web Django

    Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django的官方文档通常包含了框架的所有相关信息,包括如何安装、配置以及如何使用其各种功能来构建一个功能完备的Web应用。 1. Django框架...

    精通Django.Django 1.8 LTS全解.pdf

    6. **中间件**:中间件是Django中的一个独特概念,它提供了一种全局处理请求和响应的方法。中间件可以用于记录日志、处理会话、执行认证和授权等。 7. **用户认证与权限**:Django内置了用户认证系统,包括注册、...

    Atom-atom-django,使用atom更快地构建django应用程序。对Zacharytamas/Atom的贡献.zip

    3. **Django调试工具**:集成pdb或其它调试工具,便于在Atom中调试Django应用。 4. **项目管理工具**:用于快速启动、停止、迁移Django项目的服务。 5. **Git命令集成**:简化版本控制操作,如提交、推送、拉取等。 ...

    Django说明及示例

    - **模板标签和过滤器**:自定义模板标签和过滤器可以扩展模板功能。 ##### 4. 表单处理 - **表单类定义**:使用表单类定义数据验证规则。 - **表单处理流程**:从用户输入获取数据,验证数据有效性,保存数据到...

    基于python+Django的OA办公系统.zip

    【标题】"基于python+Django的OA办公系统"是一个典型的Web应用程序开发项目,它结合了Python编程语言和Django框架来构建一个办公自动化(OA)系统。在计算机科学领域,OA系统通常用于提高组织的工作效率,实现无纸化...

    python django官方手册

    - **自定义模板标签与过滤器**:丰富模板功能,增加动态效果。 - **编写自定义存储系统**:替代默认的文件存储方式,提供更多选择。 - **部署 Django**:介绍常见的部署方案,包括服务器配置、负载均衡等。 - **错误...

    Django Web框架 v3.2.25.zip

    "毕业设计论文"标签意味着Django 3.2.25可能被用作毕业设计的基础,学生可以用它来构建一个完整的Web应用,展示他们在Web开发课程中学到的技能。Django的全面性使其成为构建复杂系统的理想选择,可以处理数据库管理...

Global site tag (gtag.js) - Google Analytics