遇到django的转义问题,故查了些东西,来给大家一起分享:
原文转载自:
http://www.9say.com/2008/11/django%E7%9A%84%E8%BD%AC%E4%B9%89%E6%80%BB%E7%BB%93%EF%BC%9Aescape%EF%BC%8Cautoescape%EF%BC%8Csafe%EF%BC%8Cmark_safe/
在此谢谢作者总结的很好!!!
初次接触django的开发者,犯的一个常见错误就是转义。
何谓转义?就是把html语言的关键字过滤掉。例如,<div>就是html的关键字,如果要在html页面上呈现<div>,其源代码就必须是<div>
默认情况下,django自动为开发者提供escape功能,即在html代码render之前,先进行转义,然后再呈现出来。这样的话,我们如果想输出一个链接,被转义之后,可能就无法得到我们想要的结果。
例如,下面的method,如果用户是匿名用户,则输出“匿名用户”,否则,输出一个链接,指向用户的profile:
def get_username(self):
return “<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username)
在template文件中,如果这样使用上面的方法:
{{topic.get_username}}
这样,输出的结果不是一个链接,而是上面链接转义后的原文。我们无法得到我们想要的结果。
有以下几种方法解决自动转义的问题:
1、filter中
修改filter函数的is_safe属性:
@register.filter
def myfilter(value):
return value
myfilter.is_safe = True
如果你需要更复杂一些,可以亲自来处理escape属性。
首先,设置filter的need_autoesacpe属性为True(默认为False),这个参数告诉django,该filter需要一个传递一个autoesacape的参数,标示是否需要进行转义处理,如果为True,则转义,反之则反。完整的例子如下:
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
def initial_letter_filter(text, autoescape=None):
first, other = text[0], text[1:]
if autoescape:
esc = conditional_escape
else:
esc = lambda x: x
result = ‘<strong>%s</strong>%s’ % (esc(first), esc(other))
return mark_safe(result)
initial_letter_filter.needs_autoescape = True
2、template中
去掉template中的自动转义可以使用filter safe,也可以使用auotescape标签,还可以修改render的autoescape属性。
使用safe filter:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
使用autoescape标签:
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
如果在autoescape的标签中include 其他的tags,autoescape的属性将被子tags继承。
修改Context类的autoescape属性:
def render(self, context):
# …
new_context = Context({‘var’: obj}, autoescape=context.autoescape)
注:autoescape标签的优先级高于Context类的autoescape属性,即如果Context中autoescape设置与模板中autoescape标签冲突,则使用autoescape标签的autoescape设置值。
>>> from django import template
>>> H=’{% autoescape off %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=True)
>>> template.Template(H).render(c)
u’<div>’
>>>
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=True)
>>> template.Template(H).render(c)
u’<div>’
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=False)
>>> template.Template(H).render(c)
u’<div>’
>>>
3、使用方法函数mark_safe
使用mark_safe函数标记后,django将不再对该函数的内容进行转义,上面的get_username可以修改为:
from django.utils.safestring import mark_safe
def get_username(self):
return mark_safe(”<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username))
分享到:
相关推荐
【标题】"Dione: 简单任务管理器API:clipboard::check_mark_button:" 描述了一个基于Python Django框架的任务管理应用。这个项目名为"Dione",它提供了一个API接口,便于用户进行任务的创建、管理和跟踪。"clipboard...
数据服务台/软件包 我们所有的开源软件包。 也可以作为。 sl 发行人 词 保持 :check_mark: :check_mark: :check_mark: :check_mark: :check_mark: ... :check_mark: ... :check_mark: ... :cross_mark
Django的 :check_mark_button: Node.js :check_mark_button: MySQL :check_mark_button: MongoDB的 :check_mark_button: 玛文 :check_mark_button: 春天 :check_mark_button: Gradle :check_mark_...
django_spam只是将常见的管理url添加到url conf中,因此当机器人(或人类)尝试访问它们时,它们将被重定向... Django 2.0 Django 2.1 Django 2.2 的Django 3.0 Django 3.1 Python 3.4 :check_mark: 的...
Django: 的是Python:python3.7 :backhand_index_pointing_down: :backhand_index_pointing_down: :backhand_index_pointing_down: :backhand_index_pointing_down: :backhand_index_pointing_down: :backhand...
:artist_palette: 概述 :white_heavy_check_mark: 项目架构 :laptop_computer: 开发栈前端ReactReact路由器萨斯Redux 代码镜像已标记服务器Django的Django REST框架MySQL云AWS RDS AWS S3 Heroku Netlify :fountain...
Django QSessions django-qsessions为Django提供了两个扩展的会话后端。 它们使用以下额外功能扩展了Django的db和cached_db后端(和Session模型): 会话具有用户的外键 会话存储IP和用户代理 这些功能可帮助您...
使用Python,Django,Tailwind和其他功能克隆Airbnb ... :cat_face::glasses::cat_face::rocket: :heavy_check_mark: 李惠成写的
### 总结 django-secretballot为Django开发者提供了一个实用的工具,使得在项目中添加投票功能变得轻而易举。其半匿名投票的设计考虑了用户隐私,同时保持了投票系统的可靠性和安全性。如果你正在使用Django并希望...
Django项目Aljo,兼职推荐的组合 :desktop_computer: 随着咖啡厅饮品的多样化,可定制的饮品数量也在增加。 :desktop_computer: :mobile_phone: 分享各种定制饮品 :mobile_phone: :star: 星巴克饮品可以添加到您在...
:check_mark: 登录 :check_mark: 登记 :check_mark: 简易预订系统(公交车,火车,飞机,酒店,汽车旅馆) :check_mark: 有关旅游景点的正确信息,并带有建议。 :check_mark: 直截了当的搜索过滤器 :check_...
_基于Docker的Django开发利器:一套高效的基于Docker的Django_3.2开发和部_DjangoOnDocker
django-watermark 该项目为您提供了一种简单的方法,可以将自定义水印应用于django支持的网站上的图像。 由( )和一些杰出的。 特征不透明度:过滤器可让您指定水印图像的透明度水印定位:您可以使用多种方法在图像...
:small_blue_diamond:前端:HTML,CSS :small_blue_diamond:后端:Python,Django该项目可帮助我们对联系人列表执行原始操作,我们可以在其中执行以下操作主页视图/搜索联系人 :check_mark_button:主视图 :check_...
特点又名挖坑区詹戈 :check_mark_button: 语义UI :check_mark_button: AWS Lambda :check_mark_button: 电报API :check_mark_button: [2020/08/12填完坑拉:)]持续挖坑用法您只需运行以下命令即可获取当月法院的...
django-头脑风暴Django应用程序,用于创建具有多个区域的站点以集思广益。 来源: : 要求Python> = 2.4 Django >= 1.0用法将“头脑风暴”添加到您的INSTALLED_APPS设置中。 在 urls.py 的某处添加对brainstorm.urls...
:red_exclamation_mark: :red_exclamation_mark: :red_exclamation_mark:指数媒体目录 :scroll: -- 使用权 :check_mark: 特征 :play_button: 未来的计划 :rocket: 描述 :blue_book: Volny Films是使用Django 2.2...
利用”|safe” 过滤器告诉django这个变量不需要转义, 如模版中:{{ data|sage }} 2.利用django模版标记关闭html或js块转义 {% autoescape off %} code.. {% endautoescape %} 补充知识:Django使用mark_safe()和...
在本项目"Django-Blog:使用Django制作博客"中,我们将探讨如何利用Python的Web框架Django构建一个功能完备的个人或企业博客系统。Django以其“快速、易用且强大”的特性深受开发者喜爱,它能够帮助我们高效地开发...
如何使用Django-restfulwork框架来构建restful api 1.安装 pip install rest_framework 安装完成后要在主settings.py里注册APP INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django....