3 回答

TA贡献1155条经验 获得超0个赞
请不要不自己做系列化:Django的有一些内置serializiation功能,并且你也可以继承串行改变其行为。
您的观点也并没有返回一个HTTP响应,但是这是应该满足合同(以及它应该返回一个HTTP响应,或者应该提出一些错误)。
相反,您将内容写入文件,但写入文件通常不是一个好主意(除非您预计文件会很大,在这种情况下您可以使用临时文件)。通过使用文件,您会创建竞争条件,黑客还可能旨在“注入”不同的文件名,从而覆盖某些文件以运行任意代码或更改凭据,最后可能服务器具有某些权限使其无法写入文件(目录的权限)。
Django 允许您将 HTTP 响应视为流对象,内容可以写入其中,例如:
from django.http import HttpResponse
from django.core import serializers
def export_categories_json(request):
response = new HttpResponse(content_type='application/json')
response['Content-Disposition'] = 'attachment;filename=categories.json'
serializers.serialize(
'json',
Category.objects.all(),
fields=['name'],
stream=response
)
return response

TA贡献1772条经验 获得超5个赞
如果要将某些内容的 json 表示写入文件,请使用json.dump:
import json
from django.shortcuts import redirect
def export_to_json(request):
with open('export.json', 'w') as f:
json.dump(list(Category.objects.all().values_list('id', 'name')), f)
return redirect('/')
添加回答
举报