我是Django的新手并且正在尝试构建一个应用来为我的项目测试一些东西。我想阅读表单 - 做一些验证,然后将输入发送到另一个模块(比如一个单独运行的调度程序)。调度程序rest api将使用表单数据(即文件)调用,调度程序将数据加载到模型中。我在调用其余的api之前使用python请求并将数据序列化为json。这是我收到错误的地方。 Django on request.FILES创建一个InMemoryUploadedFile类,它将数据加载到内存中,并将其序列化为Json并不简单。我尝试寻找其他方式(如图像序列化示例)但无法解决此问题。
forms.py
class UploadDatasetForm(forms.Form):
docfile = forms.FileField(label='Choose file')
views.py
def test_upload(request):
if request.method == 'POST':
form = UploadDatasetForm(request.POST, request.FILES)
if form.is_valid():
in_file = request.FILES['docfile']
payload = {'doc_file': in_file}
msg = json.dumps(payload)
URL = 'http://localhost:8880/form'
r = requests.post(URL, data=msg)
return HttpResponse(json.dumps(r.text), content_type="application/json")
错误:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <InMemoryUploadedFile: A_test.csv (text/csv)> is not JSON serializable
这里的任何帮助将不胜感激。非常感谢。
答案 0 :(得分:4)
看起来您正在尝试序列化对InMemoryUploadedFile实例的引用 - 如果您只想要JSON序列化数据而不是整个类实例,则可以读取数据。
替换:
payload = {'doc_file': in_file}
使用
payload = {'doc_file': in_file.read()}
如果数据很大,你一定要使用chunks():https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks
答案 1 :(得分:3)
默认情况下,python仅支持转换一个充满默认数据类型的手(str,int,float,dict,list等)。您尝试转换InMemoryUploadedFile,转储功能不知道如何处理。您需要做的是提供一种方法将数据转换为python支持的数据类型之一。
class MyJsonEncoder(DjangoJSONEncoder):
def default(self, o):
if isinstance(o, InMemoryUploadedFile):
return o.read()
return str(o)
msg = json.dumps(payload, cls=MyJsonEncoder)