2013-06-04 36 views
8

tôi là tạo ra một API từ một cơ sở dữ liệu MongoDB sử dụng Flask và có đoạn mã sau:Flask Display Json trong một cách gọn gàng

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) 

nào khi được gọi với lợi nhuận lớn CSCI:

[{"course": "CSCI052", "description": "Nguyên tắc cơ bản của Khoa học Máy tính. Nền tảng vững chắc trong lập trình chức năng, thủ tục và trừu tượng hóa dữ liệu, đệ quy và giải quyết vấn đề. Ứng dụng cho các lĩnh vực chính của khoa học máy tính, bao gồm các thuật toán và sự phức tạp , kiến ​​trúc và tổ chức máy tính, ngôn ngữ lập trình, automata hữu hạn và computa bility. Khóa học này đóng vai trò tương tự như HM 60 như một điều kiện tiên quyết cho các khóa học khoa học máy tính phân chia ở bất kỳ trường Cao đẳng Claremont nào. Điều kiện tiên quyết: 51. "," người hướng dẫn ":" Bull, Everett L. ,, Jr. "," name ":" Nguyên tắc cơ bản về Khoa học Máy tính "," số ": 52," trường học ":" PO "}]

làm thế nào để trở lại từ điển này để mỗi khoá và giá trị là trên một dòng riêng của họ

+0

đối với sử dụng '' json.dimps' luận indent' này, nhưng bạn đã có nó. Đây không phải là JSON được rút gọn, bởi vì bạn có dấu cách sau dấu phẩy và ':'. Vậy làm thế nào bạn có được kết quả này (trong trình duyệt, log/print, wget)? Có lẽ bạn cần sử dụng 'return Response (, mimetype = 'application/json')' hoặc 'flask.jsonofy' với đối số' indent'. – tbicr

Trả lời

13

Flask cung cấp jsonify() như là một tiện nghi:

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) 

này sẽ trả lại kwargs của jsonify như một độc đáo phản hồi json được định dạng và, không giống như mã của bạn, sẽ gửi tiêu đề Content-Type thích hợp: application/json.

Tuy nhiên, hãy lưu ý những gì các tài liệu nói về vấn đề này:

phản ứng của chức năng này sẽ được khá in nếu nó không được yêu cầu với X-Requested-With: XMLHttpRequest để đơn giản hóa gỡ lỗi trừ khi các tham số cấu hình JSONIFY_PRETTYPRINT_REGULAR được thiết lập là false.

Điều này có nghĩa là phản hồi ajax sẽ luôn nhận được JSON không được in đẹp (vì chính sách Same Origin không thể hủy đặt số X-Requested-With). Nhưng tôi tưởng tượng điều này sẽ không phải là một vấn đề vì JSON cho JS tiêu thụ không cần phải được định dạng (đó chỉ là thêm dữ liệu được gửi qua dây).

Nếu bạn muốn vẫn sử dụng json.dumps() (không khá in), bạn có thể gửi Mimetype thích hợp bằng cách quay một flask.Response, tuy nhiên, bạn nên cân nhắc 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') 

Để biết thêm về sự khác biệt :

+0

tính đến tiêu đề Flask 0.13 "X-Requested-With" bị bỏ qua và quá trình in đẹp sẽ chỉ bị ép ở chế độ gỡ lỗi (nếu JSONIFY_PRETTYPRINT_REGULAR không được đặt), vui lòng cập nhật câu trả lời. –

0

Nếu vì một số lý do bạn cần phải quá đi xe flask.jsonify (thêm một bộ mã hóa tùy chỉnh cho ví dụ), bạn có thể làm như vậy với các phương pháp sau đây mà thực hiện các @phpmycoder vá bảo mật được đề cập:

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

đáp ứng:

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

Xem tôi other answer cho một ví dụ sử dụng một bộ mã hóa tùy chỉnh json

+0

Vì chỉ có một khóa học được trả về, bạn không cần danh sách. Nếu bạn có một tuyến đường khác trả về nhiều khóa học, bạn có thể làm điều này: 'courses = query.that.returns.list' và' return jsonify (courses = courses) ' – reubano

Các vấn đề liên quan