【问题标题】:Allow HTML characters in Django Rest Framework serializers在 Django Rest Framework 序列化程序中允许 HTML 字符
【发布时间】:2021-09-08 16:53:28
【问题描述】:

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

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

这是我的序列化器:

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

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

【问题讨论】:

  • 也许你的前端正在这样做?你能检查一下你的数据库中实际存储了什么,你能举一个实际的api输出json的例子吗?据我所知,DRF 不会像这样进行任何转义。
  • 前端没有这样做@AndrewBacker。数据库中有 HTML,DRF 吐出转义字符。
  • 这不是我听说过的 DRF 的一个功能,我的 api 和众多端点都没有这样做。您将必须提供 MWE stackoverflow.com/help/minimal-reproducible-example
  • 你是对的! JSON 美化器扩展正在执行此操作。运行 cURL 时,它按预期工作。谢谢!!

标签: django django-rest-framework


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 2018-05-24
    • 2019-04-01
    • 2020-10-30
    • 2016-12-18
    • 2017-06-04
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多