2013-06-04 1 views
8

に私はフラスコを使用してのMongoDBデータベースからAPIを作成し、次のコードを持っている:フラスコ表示JSONきちんとした方法

CSCIの主要なリターンと呼ば
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) 

[{"コース": "CSCI052"、 "description": "コンピュータ・プログラミングの基礎、機能的プログラミング、手続き的およびデータ抽象化、再帰および問題解決の堅固な基礎、アルゴリズムおよび複雑さを含むコンピュータ科学の主要分野への応用、コンピュータアーキテクチャと組織、プログラミング言語、有限オートマトンとコンピュタbility。このコースは、Claremont Collegesのいずれかの上級コンピュータサイエンスコースの前提条件として、HM 60と同じ役割を果たします。前提条件:51. "、"インストラクター ":"ブル、エヴェレットL.、ジュニア "、"名前 ":"コンピュータサイエンスの基礎 "、"番号 ":52、"学校 ":" PO "}]

各キーと値が自分のライン上にあるように

は、どのように私はこの辞書を返さない

+0

を使用して参照してください、しかし、あなたはすでにそれを持っています。コンマと ':'の後ろにスペースがあるので、これは縮小されたJSONではありません。だから、どのようにこの出力を得る(ブラウザ、ログ/プリント、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) 

これがうまくとしてjsonifyのkwargsからを返します。あなたのコードとは異なり、適切なContent-Typeヘッダーを送信します:application/json

しかし、ドキュメントはこれについて言うことに注意してください:

それはJSONIFY_PRETTYPRINT_REGULARのconfigパラメータがfalseに設定されていない限り、デバッグを容易にするためにX-Requested-With: XMLHttpRequestを要求されなかった場合、この関数の応答はかなり印刷されます。

これは、(同一生成元ポリシーがX-Requested-With設定を解除することができなくなりますので)AJAX応答は常に非prettyprinted JSONを受け取ることを意味します。しかし、私はこれがJSのJS消費のためにフォーマットされる必要はない(これはワイヤを介して送信される単なるデータです)ので、これは大きな問題ではないと思います。違いの詳細については

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

あなたは(非きれいに印刷)まだjson.dumps()を使用したい場合は、あなたがflask.Responseを返すことで、適切なMIMEタイプを送信することができますが、しかし、あなたはthe security implications of thisを検討すべきです:

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

応答:

{ 
    "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.dimps` indent`引数にはカスタムJSONエンコーダ

+0

1つのコースしか返されないので、リストは必要ありません。複数のコースを返す別のルートがある場合は、これを行うことができます: 'courses = query.that.returns.list'と' return jsonify(courses = courses) ' – reubano

関連する問題