2016-11-08 7 views
1

ich das queryset im JSON-Format zurückkehren wollen, und ich verwende die JsonResponse wie die folgenden:django.http.JsonResponse json Daten in falsche Format zurück

def all_alert_history(request): 
''' get all all alert history data ''' 
    all_data_json = serializers.serialize('json', LatestAlert.objects.all()) 
    return JsonResponse(all_data_json,safe=False) 

aber der Browser zeigt wie folgt aus:

"[{\"fields\": {\"alert_name\": \"memory usage\", \"alert_value\": 83.7, \"alert_time\": \"2016-11-08T06:21:20.717Z\", \"alert_level\": \"warning\", \"alert_rule\": \"warning: > 80%\"}, \"model\": \"alert_handler.latestalert\", \"pk\": \"xyz.test-java.ip-10-0-10-138.memory.percent\"}]" 

ich ersetze die JsonResponse mit HttpResponse:

def all_alert_history(request): 
''' get all all alert history data ''' 
all_data_json = serializers.serialize('json', LatestAlert.objects.all()) 
return HttpResponse(all_data_json, content_type='application/json') 

und der Browser zeigt wie folgt aus:

[{"fields": {"alert_name": "memory usage", "alert_value": 83.7, "alert_time": "2016-11-08T06:21:20.717Z", "alert_level": "warning", "alert_rule": "warning: > 80%"}, "model": "alert_handler.latestalert", "pk": "xyz.test-java.ip-10-0-10-138.memory.percent"}] 

so, warum die \ erscheint, wenn ich die JsonResponse verwenden, aber verschwinden, wenn die HttpResponse benutzen?

django Version: 1.8

Antwort

0

JsonResponse ein Python-Wörterbuch nimmt und gibt ihn als json formatierten String für den Browser.

Da Sie die JsonResponse mit einer bereits json formatierten Zeichenfolge bereitstellen, wird versucht, alle erforderlichen Zeichen mit \ zu entgehen.

Beispiel:

>>> from django.http import JsonResponse 
>>> response = JsonResponse({'foo': 'bar'}) 
>>> response.content 
b'{"foo": "bar"}' 

In Ihrem Fall JsonResponse sogar warnt Sie vor, was Sie tun, wenn ein String übergeben, daher notwendig, den safe = False Parameter machen:

>>> mydata = {"asd":"bdf"} 
>>> import json 
>>> myjson = json.dumps(mydata) 
>>> JsonResponse(myjson) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/swozny/work2/local/lib/python2.7/site-packages/django/http/response.py", line 500, in __init__ 
    raise TypeError('In order to allow non-dict objects to be ' 
TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False 

Mit dem Parameter auf False Ihr beobachtetes Verhalten ist reproduzierbar:

>>> JsonResponse(myjson,safe=False).content 
'"{\\"asd\\": \\"bdf\\"}"' 

Endergebnis ist, dass, wenn Ihr Modell ein wenig komplexer als grundlegende Datentypen ist (IntegerField, CharField, ...), Sie wahrscheinlich die Serialisierung selbst tun und bei HttpResponse bleiben oder einfach djangorestframework verwenden möchten, die Werkzeuge zu tun anbietet es für dich.

+0

aber wenn ich den 'queryset' direkt in' JsonResponse' wird es eine Fehlermeldung erhalten: 'Typeerror bei/all_history [, ] ist nicht JSON serializable'. das 'LatestAlert.objects.all()' ist ein 'queryset', ich weiß nicht, wie man es in ein dict umwandelt. Ich bin ein Newcomer in Django –

+0

Ja, deshalb bleiben Sie bei 'all_data_json = serializers.serialize ('json', LatestAlert.objects.all()) Rückgabe HttpResponse (all_data_json, content_type = 'Anwendung/Json')' –

+0

ok , werde ich versuchen, 'Django-Rest-Framework', thx :) –