Estoy tratando de construir una API simple usando Flask, en el que ahora quiero leer algunos JSON PUBLICADOS. Hago la POST con la extensión Postman Chrome, y la JSON I POST es sencilla {"text":"lalala"}
. Intento leer el JSON usando el siguiente método:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
En el navegador, devuelve correctamente el UUID que puse en el GET, pero en la consola, solo se imprime None
(donde espero que imprima {"text":"lalala"}
. ¿Alguien sabe cómo puedo obtener el JSON publicado desde el método Flask?
Como referencia, aquí hay un código completo sobre cómo enviar json desde un cliente Python:
La entrada "json =" establecerá automáticamente el tipo de contenido, como se explica aquí: Publique JSON usando las solicitudes de Python
Y el cliente anterior funcionará con este código del lado del servidor:
fuente
Esta es la forma en que lo haría y debería ser
Con
silent=True
set, laget_json
función fallará en silencio cuando intente recuperar el cuerpo json. Por defecto, esto está configurado enFalse
. Si siempre espera un cuerpo json (no opcionalmente), déjelo comosilent=False
.La configuración
force=True
ignorará larequest.headers.get('Content-Type') == 'application/json'
comprobación que el matraz hace por usted. Por defecto, esto también está configurado enFalse
.Ver la documentación del matraz .
Recomiendo irse
force=False
y hacer que el cliente envíe elContent-Type
encabezado para hacerlo más explícito.¡Espero que esto ayude!
fuente
silent=True
. Sí, esto es posible, y lo uso. Realmente se basa en cómo diseñas tu API para ser consumida. Si no hay un caso así para su punto final, simplemente elimínelosilent=True
o configúrelo explícitamenteFalse
.print(content)
aftercontent = request.get_json()
imprime el objeto ... pero como un objeto Python válido (y no como un objeto JSON válido). Por ejemplo, utiliza comillas simples, mientras que JSON requiere estrictamente comillas dobles tanto para los valores clave (cadenas) como para los valores de cadena. Si desea la representación JSON, úselajson.dumps()
con el objeto.Suponiendo que haya publicado JSON válido con el
application/json
tipo de contenido,request.json
tendrá los datos JSON analizados.fuente
response = request.post('http://127.0.0.1:5000/hello', json={"foo": "bar"})
. Después de esta ejecuciónresponse.json()
debería volver{'foo': 'bar'}
{'foo': 'bar'}
no es válido JSON. Podría ser una representación de objeto Python válida que se parezca mucho a JSON, pero JSON válido usa estrictamente comillas dobles.get_json()
método de solicitud decodifica desde JSON a objetos Python, sí. ¿Dónde espera que produzca un documento JSON válido?.json()
o.get_json()
que devuelva una representación de objeto JSON válida, no un dict de Python. Solo estoy mirando el nombre e infiero lo que podría salir de él.Para todos aquellos cuyo problema fue de la llamada ajax, aquí hay un ejemplo completo:
Llamada Ajax: la clave aquí es usar ay
dict
luegoJSON.stringify
Y en el lado del servidor:
fuente
Para dar otro enfoque.
fuente
Suponiendo que ha publicado un JSON válido,
fuente
Intenta usar el parámetro de fuerza ...
request.get_json(force = True)
fuente