在 Django 的 TextField 中禁用 HTML 转义
当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?
How can I turn off Django's automatic HTML escaping, when I write into model's TextField?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
只需使用 django 的 safe 过滤器即可。在你的模板中你会做这样的事情:
Just use django's safe filter. In your template you would do something like this:
一种方法是在模型中放置一个函数,该函数返回标记为安全的数据:
然后在模板中您必须使用:
One way to do it is to put a function in your model which returns the data marked as safe:
Then in the template you would have to use:
我认为更好的方法就是@Daniel Vassallo 所描述的。
为什么?
这样,您就可以对要显示的 HTML 代码执行一些安全操作,而无需转义,特别是防止跨站点脚本攻击 (XSS)。
例如,您可以检查
my_textfield
是否包含 script 标记。如果是这样,则将该实例标记为恶意并返回
my_textfield
的转义版本(正常的 Django 行为)。否则,请使用
mark_safe
返回标记为安全的 HTML 代码。这里:
所有这些都不需要对数据库进行任何迁移。
替代方法
我认为您可以通过覆盖模型的 save() 方法来执行此安全操作,并包括针对其中恶意内容的检查和任何其他必要的操作。然后,如果您确保任何保存的内容都是安全的,您可以使用@bjunix解决方案。
I think the better way to do it is as @Daniel Vassallo described.
Why?
Because this way, you can do some security operations on the HTML code that you want to display without escaping, particularly to protect against cross site scripting (XSS).
For example, you can check if
my_textfield
contains a script tag.If so, mark the instance as malicious and return an escaped version of
my_textfield
(the normal Django behavior).Otherwise, use
mark_safe
to return your HTML code marked as safe.Here:
And all of this doesn't need any migrations to the database.
Alternative approach
I think that you can do this security operation by overriding the
save()
method of your model, and including the check and any other necessary operation against malicious content inside of it. Then, you might use @bjunix solution if you ensured that any saved content is safe.