Saya mencoba membangun API sederhana menggunakan Flask, di mana saya sekarang ingin membaca beberapa JSON POST. Saya melakukan POST dengan ekstensi Chrome tukang pos, dan JSON I POST sederhana {"text":"lalala"}
. Saya mencoba membaca JSON menggunakan metode berikut:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
Di browser, ia mengembalikan UUID yang saya masukkan ke GET dengan benar, tetapi di konsol, ia hanya mencetak None
(di mana saya mengharapkannya untuk mencetak {"text":"lalala"}
. Apakah ada yang tahu bagaimana saya bisa mendapatkan JSON yang diposting dari dalam metode Flask?
Untuk referensi, inilah kode lengkap bagaimana mengirim json dari klien Python:
Input "json =" akan secara otomatis mengatur tipe konten, seperti yang dibahas di sini: Posting JSON menggunakan Permintaan Python
Dan klien di atas akan bekerja dengan kode sisi server ini:
sumber
Ini adalah cara saya akan melakukannya dan memang seharusnya begitu
Dengan
silent=True
set,get_json
fungsi akan gagal secara diam-diam ketika mencoba mengambil tubuh json. Secara default ini diatur keFalse
. Jika Anda selalu mengharapkan json body (tidak opsional), biarkan sajasilent=False
.Pengaturan
force=True
akan mengabaikanrequest.headers.get('Content-Type') == 'application/json'
pemeriksaan yang dilakukan flask untuk Anda. Secara default ini juga diatur keFalse
.Lihat dokumentasi labu .
Saya akan sangat menyarankan untuk pergi
force=False
dan membuat klien mengirimContent-Type
tajuk untuk membuatnya lebih eksplisit.Semoga ini membantu!
sumber
silent=True
. Ya ini mungkin, dan saya menggunakannya. Ini benar-benar didasarkan pada bagaimana Anda merancang API Anda untuk dikonsumsi. Jika tidak ada kasus seperti itu untuk titik akhir Anda, cukup hapussilent=True
atau atur secara eksplisitFalse
.print(content)
setelahcontent = request.get_json()
mencetak objek ... tetapi sebagai objek Python yang valid (dan bukan sebagai objek JSON yang valid). Sebagai contoh, ia menggunakan tanda kutip tunggal sementara JSON secara ketat membutuhkan tanda kutip ganda untuk kedua nilai kunci (string) sebagai nilai string. Jika Anda ingin representasi JSON, gunakanjson.dumps()
dengan objek.Dengan asumsi Anda telah memposting JSON yang valid dengan
application/json
jenis konten,request.json
akan memiliki data JSON yang diuraikan.sumber
response = request.post('http://127.0.0.1:5000/hello', json={"foo": "bar"})
. Setelah menjalankan iniresponse.json()
harus kembali{'foo': 'bar'}
{'foo': 'bar'}
JSON tidak valid. Ini bisa menjadi representasi objek Python yang valid yang sangat mirip JSON, tetapi JSON yang valid secara ketat menggunakan tanda kutip ganda.get_json()
metode permintaan menerjemahkan dari JSON ke objek Python, ya. Di mana Anda mengharapkannya untuk menghasilkan dokumen JSON yang valid?.json()
atau.get_json()
mengembalikan representasi objek JSON yang valid, bukan dict Python. Saya hanya melihat nama, dan menyimpulkan apa yang keluar dari itu.Untuk semua orang yang masalahnya berasal dari panggilan ajax, berikut adalah contoh lengkapnya:
Panggilan Ajax: kuncinya di sini adalah menggunakan a
dict
laluJSON.stringify
Dan di sisi server:
sumber
Untuk memberikan pendekatan lain.
sumber
Dengan asumsi bahwa Anda telah memposting JSON yang valid,
sumber
Coba gunakan parameter kekuatan ...
request.get_json(force = True)
sumber