Próbuję przetwarzać przychodzące żądania JSON / Ajax za pomocą Django / Python.
request.is_ajax()
jest True
na żądanie, ale nie mam pojęcia, gdzie jest ładunek z danymi JSON.
request.POST.dir
zawiera to:
['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__',
'__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__setitem__', '__str__', '__weakref__', '_assert_mutable', '_encoding',
'_get_encoding', '_mutable', '_set_encoding', 'appendlist', 'clear', 'copy', 'encoding',
'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues',
'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update',
'urlencode', 'values']
Najwyraźniej nie ma kluczy w kluczach pocztowych żądań.
Kiedy patrzę na POST w Firebug , w żądaniu wysyłane są dane JSON.
len(request.POST)
irequest.POST.items()
to też pomaga.Odpowiedzi:
Jeśli wysyłasz JSON do Django, myślę, że chcesz
request.body
(request.raw_post_data
na Django <1.4). W ten sposób otrzymasz nieprzetworzone dane JSON wysłane pocztą. Stamtąd możesz go dalej przetwarzać.Oto przykład wykorzystujący JavaScript, jQuery , jquery-json i Django.
JavaScript:
Django:
Django <1,4:
źródło
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
Miałem ten sam problem. Publikowałem złożoną odpowiedź JSON i nie mogłem odczytać moich danych za pomocą słownika request.POST.
Moje dane POST JSON to:
W takim przypadku musisz skorzystać z metody dostarczonej przez aurealus. Przeczytaj request.body i zdeserializuj go przy użyciu standardowego biblioteki json.
źródło
json_data = simplejson.loads(request.raw_post_data)
czy na pewno to poprawnie określono?django.utils.simplejson
został usunięty w ostatnich wersjach. Po prostu użyjjson
biblioteki stdlib .Metoda 1
Klient: wyślij jako
JSON
Serwer :
Metoda 2
Klient: Wyślij jako
x-www-form-urlencoded
(Uwaga:
contentType
&processData
zostały zmienione,JSON.stringify
nie są potrzebne)Serwer :
Zmieniono w wersji 1.5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests
Prawdopodobnie powiązane
źródło
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
Należy pamiętać, że Python 3 inaczej przedstawia łańcuchy - są to tablice bajtowe.
Używając Django 1.9 i Python 2.7 i wysyłając dane JSON w głównej części (nie nagłówku), użyłbyś czegoś takiego:
Ale dla Django 1.9 i Python 3.4 użyłbyś:
Właśnie przeszedłem tę krzywą uczenia się, tworząc moją pierwszą aplikację Py3 Django!
źródło
request.raw_response
jest teraz przestarzała. Użyjrequest.body
zamiast tego do przetwarzania niekonwencjonalnych danych formularzy, takich jak ładunki XML, obrazy binarne itp.Dokumentacja Django na ten temat .
źródło
na django 1.6 python 3.3
klient
serwer
źródło
Ładunek HTTP POST to tylko płaska wiązka bajtów. Django (podobnie jak większość frameworków) dekoduje go do słownika z parametrów zakodowanych w adresie URL lub z kodowania wieloczęściowego MIME. Jeśli po prostu zrzucisz dane JSON w treści POST, Django ich nie zdekoduje. Albo wykonaj dekodowanie JSON z pełnej zawartości POST (nie ze słownika); lub umieść dane JSON w opakowaniu wieloczęściowym MIME.
Krótko mówiąc, pokaż kod JavaScript. Wydaje się, że problem istnieje.
źródło
request.raw_post_data
został wycofany. Użyjrequest.body
zamiast tegoźródło
Coś takiego. Zadziałało: poproś o dane od klienta
Przetwarzaj żądanie na serwerze
źródło
źródło
Używając Angulara, powinieneś dodać nagłówek do żądania lub dodać go do nagłówków konfiguracji modułu:
{'Content-Type': 'application/x-www-form-urlencoded'}
źródło
request.POST jest po prostu obiektem podobnym do słownika, więc po prostu zindeksuj go za pomocą składni dict.
Zakładając, że twoje pole formularza jest fred, możesz zrobić coś takiego:
Alternatywnie użyj obiektu formularza do obsługi danych POST.
źródło