django - 在 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>",
"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
推荐阅读
- asp.net-core - NSwag 的生成代码是什么意思?
- java - 放心 - 比较两个 JSON 对象
- unity3d - 移动文件夹后,统一键不起作用
- python - 为什么我的 TensorFlow 模型在加载后会失去准确性
- javascript - 如果可观察对象为空,如何隐藏 div
- apache-spark - 使用scala计算火花的总体百分比
- rust - rust 语言源中的哪个源文件引用_to/parse 语言关键字
- discord.js - TypeError [INVALID_TYPE]:提供的角色不是角色、雪花或数组或角色或雪花的集合
- java - 如何读取带反斜杠的 DICOM 字符串值(VR=LO,Value="0.4323\0.2325")?
- java - ZonedDateTime 时区不一致问题?