json - tutorial - serializer errors django




Cómo serializar(JSON) FileField en Django (2)

Soy nuevo en Django e intento crear una aplicación para probar algunas cosas para mi proyecto. Quiero leer el formulario, hacer una validación y luego enviar la entrada a otro módulo (digamos un planificador ejecutándose por separado). La API del resto del planificador se invocará con los datos del formulario (que es el archivo) y el planificador cargará los datos en los modelos. Estoy utilizando solicitudes python y serializando datos en json antes de llamar al resto api. Aquí es donde obtengo el error. Django a petición. FILES crea una clase InMemoryUploadedFile que tiene los datos cargados en algún lugar de la memoria y serializar esto a Json no es sencillo. Intenté buscar otras formas (como el ejemplo de serializadores de imágenes) pero no pude resolver este problema.

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")

Error:

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <InMemoryUploadedFile: A_test.csv (text/csv)> is not JSON serializable

Cualquier ayuda aquí será apreciada. Muchas gracias.


Por defecto, python solo admite la conversión de una mano llena de tipos de datos predeterminados (str, int, float, dict, list, etc.). Intenta convertir InMemoryUploadedFile, la función de vuelcos no sabe cómo manejar eso. Lo que debe hacer es proporcionar un método para convertir los datos en uno de los tipos de datos compatibles con python.

class MyJsonEncoder(DjangoJSONEncoder):
    def default(self, o):
        if isinstance(o, InMemoryUploadedFile):
           return o.read()
        return str(o)


msg = json.dumps(payload, cls=MyJsonEncoder)





django-views