You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JSON与Django REST Framework存取HTML代码至数据库

如何在Django REST Framework中完整保存并取回HTML模板数据(无标签丢失)

你的需求其实已经接近实现了——现有代码的核心逻辑是没问题的,不过有几个细节需要调整和确认,才能确保HTML标签完整保存、取回且不会出现格式错误:

1. 先修复get_object方法的关键错误

你的HTMLDataDetail类里的get_object方法有个小bug:当找不到对应ID的对象时,它直接返回了Response,但这个方法的设计是要返回模型实例或者抛出异常的。如果返回Response,后续的get/put/delete方法会把这个响应对象传给序列化器,直接导致报错。

修改成这样:

from django.http import Http404

class HTMLDataDetail(APIView):
    def get_object(self, id):
        try:
            return AddHTML.objects.get(id=id)
        except AddHTML.DoesNotExist:
            raise Http404  # 抛出404异常,DRF会自动处理成正确的响应
    # 其他方法保持不变

2. 确保HTML数据的正确传输与存储

其实你的现有视图代码已经能完整保存和读取HTML内容了,因为:

  • 模型里的HTML_code是TextField,可以存储任意长度的文本,包括完整的HTML标签
  • DRF的序列化器会自动处理JSON格式的转义(比如把<转成\u003c),这是符合JSON规范的,前端拿到数据后可以直接解析成原始HTML使用

需要注意的是:

  • 前端发送POST/PUT请求时,要确保请求的Content-Type是application/json,这样DRF的解析器能正确处理包含HTML的JSON数据
  • 不要在视图层对HTML_code做任何额外的转义、截断或过滤操作(除非你有安全需求),保持数据的原始性

3. 可选:添加XSS安全防护(按需)

如果你的HTML数据是由普通用户提交,并且后续要直接渲染到页面上,建议添加XSS防护,避免恶意脚本注入。可以用bleach库来清理HTML:

  1. 先安装依赖:
pip install bleach
  1. 在序列化器里重写字段的序列化逻辑,只允许安全的标签和属性:
from bleach import clean

class AddHTMLSerializer(serializers.ModelSerializer):
    class Meta:
        model = AddHTML
        fields = '__all__'

    def to_representation(self, instance):
        data = super().to_representation(instance)
        # 自定义允许的HTML标签、属性和样式
        data['HTML_code'] = clean(
            data['HTML_code'],
            tags=['p', 'div', 'h1', 'h2', 'a'],
            attributes={'a': ['href'], 'div': ['class']},
            styles=['color', 'margin']
        )
        return data

如果你的HTML来源是可信的(比如只有管理员能提交),这一步可以跳过。

总结

核心的保存/读取逻辑你已经写对了,主要是修复get_object的异常处理问题,同时确保请求格式正确。这样就能完整保存并取回HTML数据,不会丢失任何标签。

内容的提问来源于stack exchange,提问作者Saim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:03:11