首页 > 解决方案 > 在 Django Rest Framework 序列化程序中允许 HTML 字符

问题描述

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

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

这是我的序列化程序:

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

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

标签: djangodjango-rest-framework

解决方案


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>",
    "html_text": "<script>console.log('hi')</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

推荐阅读