Muestra JSON devuelto de Flask de forma ordenada

Estoy creando una API usando Flask y tengo el siguiente código:

@app.route('//') def major_res(major): course_list = list(client.db.course_col.find({"major": (major.encode("utf8", "ignore").upper())})) return json.dumps(course_list, sort_keys=True, indent=4, default=json_util.default) 

Al ver /csci/ en el navegador, la salida se ve así:

 [{ "course": "CSCI052", "description": "Fundamentals of Computer Science. A solid foundation in functional programming, procedural and data abstraction, recursion and problem-solving. Applications to key areas of computer science, including algorithms and complexity, computer architecture and organization, programming languages, finite automata and computability. This course serves the same role as HM 60 as a prerequisite for upper-division computer science courses at any of the Claremont Colleges. Prerequisite: 51.", "instructor": "Bull, Everett L.,, Jr.", "name": " Fundamentals of Computer Science", "number": 52, "school": "PO" }] 

¿Cómo devuelvo este diccionario para que cada clave y valor estén en su propia línea?

Flask proporciona jsonify() como una conveniencia:

 from flask import jsonify @app.route("//") def major_res(major): course_list = list(client.db.course_col.find({"major": major.upper()})) return flask.jsonify(**course_list) 

Esto devolverá los jsonify de jsonify como una representación JSON y, a diferencia de su código, enviará el encabezado de Content-Type adecuado: application/json . Tome nota de lo que dicen los documentos sobre el formato:

La respuesta de esta función se imprimirá bastante si el parámetro de configuración JSONIFY_PRETTYPRINT_REGULAR se establece en True o si la aplicación Flask se ejecuta en modo de depuración. El formato comprimido (que no es bonito) actualmente significa que no hay sangrías ni espacios después de los separadores.

Las respuestas recibirán JSON no impresas cuando no estén en modo de depuración. Esto no debería ser un problema ya que JSON para el consumo de JavaScript no debería tener que ser formateado (eso es solo datos adicionales que se enviarán a través del cable), y la mayoría de las herramientas recibieron el formato JSON por su cuenta.

Si desea seguir utilizando json.dumps() , puede enviar el tipo de mímeto adecuado devolviendo una Response con current_app.response_class() .

 from flask import json, current_app @app.route("//") def major_res(major): course_list = list(client.db.course_col.find({"major": major.upper() })) return current_app.response_class(json.dumps(course_list), mimetype="application/json") 

Para más sobre la diferencia:

  • json.dumps vs flask.jsonify
  • módulo de flask.json documentos

Antes de Flask 1.0, el manejo de JSON era algo diferente. jsonify intentaría detectar si una solicitud era AJAX y devolvería una impresión si no lo fuera; Esto fue eliminado porque no era confiable. jsonify solo permite dicts como objeto de nivel superior por razones de seguridad ; Esto ya no es aplicable en los navegadores modernos.

Si, por alguna razón, necesita flask.jsonify (agregando un codificador personalizado, por ejemplo), puede hacerlo con el siguiente método que implementa la revisión de seguridad @phpmycoder mencionada:

 from json import dumps from flask import make_response def jsonify(status=200, indent=4, sort_keys=True, **kwargs): response = make_response(dumps(dict(**kwargs), indent=indent, sort_keys=sort_keys)) response.headers['Content-Type'] = 'application/json; charset=utf-8' response.headers['mimetype'] = 'application/json' response.status_code = status return response app.route('//') def major_res(major): course = client.db.course_col.find({"major": (major.encode("utf8", "ignore").upper())}) return jsonify(**course) app.route('/test/') def test(): return jsonify(indent=2, sort_keys=False, result="This is just a test") 

Respuesta:

 { "course": "CSCI052", "description": "Fundamentals of Computer Science. A solid foundation in functional programming, procedural and data abstraction, recursion and problem-solving. Applications to key areas of computer science, including algorithms and complexity, computer architecture and organization, programming languages, finite automata and computability. This course serves the same role as HM 60 as a prerequisite for upper-division computer science courses at any of the Claremont Colleges. Prerequisite: 51.", "instructor": "Bull, Everett L.,, Jr.", "name": " Fundamentals of Computer Science", "number": 52, "school": "PO" } 

Ver mi otra respuesta para un ejemplo usando un codificador json personalizado