博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django自定义过滤器中is_safe和need_autoescape两个参数的理解
阅读量:6813 次
发布时间:2019-06-26

本文共 1709 字,大约阅读时间需要 5 分钟。

自定义template过滤器的方法,不再赘述

is_safe

文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True),但是对is_safe的具体作用说的云山雾绕的,而查了些博文只是简单的说is_safe可以关闭掉自动转义(这个说法是错误的!)

我尝试了加或者不加is_safe的效果

@register.filterdef demo(value):    return '
' + value@register.filter(is_safe=True)def demo(value): return '
' + value
  • {
    { text|demo}}
  • 结果就是都对过滤器返回的结果进行了转义!

    后来发现重点在于文档中的这一句话:

    This flag tells Django that if a “safe” string is passed into your filter, the result will still be “safe” and if a non-safe string is passed in, Django will automatically escape it, if necessary.

    这个标志告诉Django 如果"安全"的字符串传递到您的过滤,结果仍将是"安全",如果一个非安全字符串传递,如果必要Django 会自动转义它。

    重点在于"安全",也就是文档中提到的SafeData类型.文档中有提到'某些正常的字符串操作会将SafeData对象转换成普通的str或unicode对象,Django的过滤器在完成之后会修复这种破坏,并且很困难'.

    这才是is_safe的意义所在:如果传入的value已经是SafeData对象,is_safe会告诉Django当前过滤器输出的数据不再需要转义.
    至于SafeData类型数据的来源,我暂时只知道mark_safe()函数会返回SafeData对象.

    from django.utils.safestring import mark_safe@register.filter()def to_safe(value):    return mark_safe(value)@register.filter(is_safe=True)def demo(value):    return '
    ' + value
  • {
    { test|to_safe|demo }}
  • 这样的情况,demo过滤器接收到一个SafeData对象,其结果不会再转义(<br>换行符起作用了).

    need_autoescape

    如果在注册过滤器时添加了need_autoescape=True,那么过滤器必须接收一个autoescape参数,这样过滤器会捕捉其引用位置的自动转义是否开启,以决定你在过滤器中的行为.

    引用下文档中的栗子:

    @register.filter(needs_autoescape=True)def initial_letter_filter(text, autoescape=True):    first, other = text[0], text[1:]    if autoescape:        esc = conditional_escape    else:        esc = lambda x: x    result = '%s%s' % (esc(first), esc(other))    return mark_safe(result)

    该过滤器的输出通过mark_safe()函数标记为"安全",这样可以保证在过滤器中引入的HTML标签可以实现.但是同样要考虑输入的安全问题.如果模板中autoescape是开启的,说明我们已经认定这部分的数据是存在威胁的,所以需要在过滤器中手动对输入数据进行转义来保证其安全性.

    转载于:https://www.cnblogs.com/thunderLL/p/7645111.html

    你可能感兴趣的文章
    14.7-2
    查看>>
    士兵杀敌(三)(线段树)
    查看>>
    类string的构造函数、拷贝构造函数和析构函数
    查看>>
    OC 消息机制本质
    查看>>
    BT.601与BT.656
    查看>>
    用css3让溢出内容显示省略号
    查看>>
    算法排序之冒泡排序
    查看>>
    IIS、Asp.net 编译时的临时文件路径(转载)
    查看>>
    Curvilinear structure detections
    查看>>
    [Android Pro] 临时关闭selinux模式 setenforce 0
    查看>>
    ASP.NET Web API WebHost宿主环境中管道、路由
    查看>>
    BZOJ4340 : BJOI2015 隐身术
    查看>>
    【转】关于Class.getResource和ClassLoader.getResource的路径问题
    查看>>
    本地Git服务器的搭建及使用
    查看>>
    zabbix 客户端安装配置
    查看>>
    servlet的filter的使用
    查看>>
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
    查看>>
    C语言 文件操作5--文件的常用函数
    查看>>
    遇到的几个难题
    查看>>
    eclipse插件spket安装
    查看>>