Дисплей с флягой Json на аккуратном пути

Я создаю API из базы данных mongodb с помощью Flask и имею следующий код:

app.route('/<major>/') 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) 

Который при вызове с основными CSCI возвращает:

[{«курс»: «CSCI052», «описание»: «Основы компьютерной науки». Прочная основа функционального программирования, процедурной и абстракции данных, рекурсии и решения проблем. Приложения к ключевым областям информатики, включая алгоритмы и сложность , компьютерная архитектура и организация, языки программирования, конечные автоматы и вычислимость. Этот курс выполняет ту же роль, что и HM 60, в качестве предпосылки для курсов по информатике высшего уровня в любом из колледжей Клермонт. Предпосылки: 51. «Инструктор»: «Bull, Everett L. ,, Jr.», «name»: «Основы информатики», «число»: 52, «школа»: «PO»}]

Как вернуть этот словарь, чтобы каждый ключ и значение были в их собственной строке?

  • Django + apache & mod_wsgi: необходимо перезапустить apache после изменений
  • Можно ли уменьшить глубину изображения с помощью PIL?
  • Какие специальные методы обходят __getattribute__ в Python?
  • Получение квантилей SciPy для соответствия функции Stata xtile
  • Python: получить ссылку для загрузки из кнопки javascript
  • Boto - Загрузка файла в определенное место на Amazon S3
  • привязки python gstreamer для окон
  • Представление даты RFC 1123 в Python?
  • 2 Solutions collect form web for “Дисплей с флягой Json на аккуратном пути”

    Flask предоставляет jsonify() в качестве удобства:

     app.route('/<major>/') def major_res(major): course_list = list(client.db.course_col.find({"major": major.encode('utf8', 'ignore').upper() })) return flask.jsonify(**course_list) 

    Это вернет kwargs jsonify как хорошо отформатированный ответ json и, в отличие от вашего кода, отправит правильный заголовок Content-Type : application/json .

    Однако, обратите внимание на то, что говорят документы об этом:

    Ответ этой функции будет довольно напечатан, если он не был запрошен с помощью X-Requested-With: XMLHttpRequest для упрощения отладки, если для параметра конфигурации JSONIFY_PRETTYPRINT_REGULAR установлено значение false.

    Это означает, что ответы ajax всегда получат не-красивую JSON (поскольку политика «Тот же исход» делает невозможным отмену X-Requested-With ). Но я полагаю, что это не будет проблемой, поскольку JSON для потребления JS не нужно форматировать (это просто дополнительные данные, которые нужно отправить по кабелю).

    Если вы хотите использовать json.dumps() (не очень красиво напечатано), вы можете отправить правильный flask.Response , вернув flask.Response Однако вы должны учитывать последствия для безопасности этого :

     app.route('/<major>/') def major_res(major): course_list = list(client.db.course_col.find({"major": major.encode('utf8', 'ignore').upper() })) return flask.Response(response=json.dumps(course_list), status=200, mimetype='application/json') 

    Подробнее о различии:

    Если по какой-то причине вам нужно перегрузить flask.jsonify (например, добавить пользовательский кодер), вы можете сделать это со следующим методом, который реализует исправление безопасности @phpmycoder, упомянутое:

     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('/<major>/') 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") 

    Отклик:

     { "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" } 

    См. Мой другой ответ для примера, используя пользовательский кодировщик json

    Python - лучший язык программирования в мире.