2013-06-04 2 views
8

Я создаю API из базы данных MongoDB, используя флягу и имеют следующий код:Колба Дисплей Json в аккуратном Путь

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. «Инструктор»: «Булл, Эверетт Л., младший», «имя»: «Основы информатики», «номер»: 52, «школа»: «ПО»}]

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

+0

для этого используется '' json.dimps' indent' аргумента, но у вас уже есть. Это не минимизировано JSON, потому что у вас есть пробелы после запятых и ':'. Итак, как вы получаете этот вывод (в браузере, log/print, wget)? Вероятно, вам нужно использовать 'return Response (, mimetype = 'application/json')' или 'flask.jsonofy' с аргументом' indent'. – tbicr

ответ

13

колба обеспечивает 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 не установлен в ложь.

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

Если вы хотите по-прежнему использовать json.dumps() (не очень печати), вы можете отправить правильный MimeType, возвращая flask.Response, однако, вы должны рассмотреть the security implications of this:

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') 

Более подробную информацию о разнице :

+0

от Flask 0.13 «X-Requested-With» заголовок игнорируется, и довольно печатная версия будет принудительно только в режиме отладки (если JSONIFY_PRETTYPRINT_REGULAR не установлен), пожалуйста, обновите ответ. –

0

Если по какой-то причине вам нужно чрезмерно ездить 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") 

Response:

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

Смотрите мой other answer для примера, используя пользовательский JSon кодер

+0

Поскольку возвращается только один курс, вам не нужен список. Если у вас есть другой маршрут, который возвращает несколько курсов, вы можете сделать это: 'course = query.that.returns.list' и' return jsonify (курсы = курсы) ' – reubano

Смежные вопросы