如何通过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:
- 先安装依赖:
pip install bleach
- 在序列化器里重写字段的序列化逻辑,只允许安全的标签和属性:
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
相关产品推荐
相关产品推荐

