允许在 Django Rest Framework 序列化程序中使用 HTML 字符

问题描述

我从 Django Rest Framework 返回 HTML 文本,但特殊字符被重写为“HTML 安全”文本。

如何防止这种行为?我知道 Django 中有一个 mark_safe() 函数,但这需要我重写序列化程序。 DRF 是否提供了一种简单的方法来执行此操作?

这是我的序列化程序:

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ("html_text",)

请注意,文本是安全的,只能由管理员输入,而不是由最终用户输入。

解决方法

DRF 并非开箱即用。

您的前端或其他一些代码正在为您执行此操作。对于我所知道的所有现代 UI 框架,这种转义都是自动的。我不是前端开发人员,所以可能我错过了一个。

为了证明这一点,我只花了几分钟用一个模型创建了一个空项目,并使用了默认路由器、sqlite 等。这是相当简单的。

Package               Version
--------------------- -------
Django                3.2.4
djangorestframework   3.12.4
~/htm ❯ http post :8000/page/ \
        html_string="<script>window.alert()</script>" \
        html_text="<script>console.log('hi')</script>"
{
    "html_string": "<script>window.alert()</script>","html_text": "<script>console.log('hi')</script>","id": 1
}

~/htm ❯ http :8000/page/1/
{
    "html_string": "<script>window.alert()</script>","id": 1
}

以及视图、路由器和模型

class Page(models.Model):
    html_string = models.CharField(max_length=1024)
    html_text = models.TextField()

class PageSerializer(ModelSerializer):
    class Meta:
        model = Page
        fields = "__all__"

class PageViewSet(ModelViewSet):
    queryset = Page.objects.all()
    serializer_class = PageSerializer

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...