Saya mencoba memproses permintaan JSON / Ajax yang masuk dengan Django / Python.
request.is_ajax()
ada True
di permintaan, tapi saya tidak tahu di mana payload adalah dengan data JSON.
request.POST.dir
berisi ini:
['__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']
Tampaknya tidak ada kunci dalam kunci posting permintaan.
Ketika saya melihat POST di Firebug , ada data JSON yang dikirim dalam permintaan.
len(request.POST)
danrequest.POST.items()
juga akan membantu.Jawaban:
Jika Anda memposting JSON ke Django, saya pikir Anda mau
request.body
(request.raw_post_data
di Django <1.4). Ini akan memberi Anda data JSON mentah yang dikirim melalui pos. Dari sana Anda dapat memprosesnya lebih lanjut.Ini adalah contoh menggunakan JavaScript, jQuery , jquery-json dan Django.
JavaScript:
Django:
Django <1.4:
sumber
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
Saya memiliki masalah yang sama. Saya telah memposting respons JSON yang kompleks, dan saya tidak bisa membaca data saya menggunakan kamus request.POST.
Data JSON POST saya adalah:
Dalam hal ini Anda perlu menggunakan metode yang disediakan oleh aurealus. Baca request.body dan deserialize dengan json stdlib.
sumber
json_data = simplejson.loads(request.raw_post_data)
apakah Anda yakin menyatakannya dengan benar?django.utils.simplejson
telah dihapus dalam versi terbaru. Cukup gunakanjson
perpustakaan stdlib .Metode 1
Klien: Kirim sebagai
JSON
Server:
Metode 2
Klien: Kirim sebagai
x-www-form-urlencoded
(Catatan:
contentType
&processData
telah berubah,JSON.stringify
tidak diperlukan)Server:
Berubah dalam 1,5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests
Mungkin terkait
sumber
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
Penting untuk diingat bahwa Python 3 memiliki cara berbeda untuk merepresentasikan string - yaitu byte array.
Menggunakan Django 1.9 dan Python 2.7 dan mengirim data JSON di badan utama (bukan header) Anda akan menggunakan sesuatu seperti:
Tetapi untuk Django 1.9 dan Python 3.4 Anda akan menggunakan:
Saya baru saja melalui kurva pembelajaran ini membuat aplikasi Py3 Django pertama saya!
sumber
request.raw_response
sekarang sudah ditinggalkan. Gunakanrequest.body
sebagai gantinya untuk memproses data formulir non-konvensional seperti muatan XML, gambar biner, dll.Dokumentasi Django tentang masalah ini .
sumber
pada django 1.6 python 3.3
klien
server
sumber
Payload HTTP POST hanya setumpuk byte. Django (seperti kebanyakan kerangka kerja) menerjemahkannya ke dalam kamus dari parameter yang disandikan URL, atau penyandian MIME-multipart. Jika Anda hanya membuang data JSON dalam konten POST, Django tidak akan memecahkan kode itu. Entah melakukan JSON decoding dari konten POST lengkap (bukan kamus); atau memasukkan data JSON ke bungkus MIME-multipart.
Singkatnya, perlihatkan kode JavaScript. Masalahnya tampaknya ada di sana.
sumber
request.raw_post_data
telah ditinggalkan. Gunakanrequest.body
sebagai gantinyasumber
Sesuatu seperti ini. Berhasil: Meminta data dari klien
Memproses permintaan di server
sumber
sumber
Menggunakan Angular Anda harus menambahkan header untuk meminta atau menambahkannya ke header konfigurasi modul:
{'Content-Type': 'application/x-www-form-urlencoded'}
sumber
request.POST hanyalah objek seperti kamus, jadi cukup indeks saja dengan sintaks dict.
Dengan asumsi bidang formulir Anda fred, Anda bisa melakukan sesuatu seperti ini:
Sebagai alternatif, gunakan objek formulir untuk menangani data POST.
sumber