在 Django 的 TextField 中禁用 HTML 转义

发布于 2024-08-18 07:27:18 字数 51 浏览 5 评论 0原文

当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?

How can I turn off Django's automatic HTML escaping, when I write into model's TextField?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

牵你的手,一向走下去 2024-08-25 07:27:18

只需使用 django 的 safe 过滤器即可。在你的模板中你会做这样的事情:

{{ instance.my_text_field|safe }}

Just use django's safe filter. In your template you would do something like this:

{{ instance.my_text_field|safe }}
风和你 2024-08-25 07:27:18

一种方法是在模型中放置一个函数,该函数返回标记为安全的数据:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()

    def display_my_safefield(self): 
        return mark_safe(self.my_textfield)

然后在模板中您必须使用:

{{ instance.display_my_safefield }}

One way to do it is to put a function in your model which returns the data marked as safe:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()

    def display_my_safefield(self): 
        return mark_safe(self.my_textfield)

Then in the template you would have to use:

{{ instance.display_my_safefield }}
秋意浓 2024-08-25 07:27:18

我认为更好的方法就是@Daniel Vassallo 所描述的。

为什么?

这样,您就可以对要显示的 HTML 代码执行一些安全操作,而无需转义,特别是防止跨站点脚本攻击 (XSS)。

例如,您可以检查 my_textfield 是否包含 script 标记。
如果是这样,则将该实例标记为恶意并返回 my_textfield转义版本(正常的 Django 行为)。

否则,请使用 mark_safe 返回标记为安全的 HTML 代码。

这里:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()
    is_malisious = models.BooleanField(default=False)

    def display_my_safefield(self):
        if '<script>' in self.my_textfield:
            self.is_malicious = True
            self.save()
            return self.my_textfield
        return mark_safe(self.my_textfield)

所有这些都不需要对数据库进行任何迁移。

替代方法

我认为您可以通过覆盖模型的 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:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()
    is_malisious = models.BooleanField(default=False)

    def display_my_safefield(self):
        if '<script>' in self.my_textfield:
            self.is_malicious = True
            self.save()
            return self.my_textfield
        return mark_safe(self.my_textfield)

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文