2016-04-12 4 views
1

GUIコンポーネントとAPIコンポーネントの両方を持つFlaskアプリケーションをセットアップしたいと思います。だからここのグループのリストを取得する簡単な例です:FlaskでHTMLとJSONの両方のコンテンツを提供するにはどうすればよいですか?

def get_groups(): 
    groups = db.session.query(SgmGroup.group_name).order_by(SgmGroup.group_name).all() 
    return [group.group_name for group in groups] 

@app.route('/list') 
def group_list(): 
    groups_list = get_groups() 
    return render_template('groups.html', groups=groups_list) 

は、これまでのところは良い - これはおそらく、テーブルまたは他のいくつかの素敵なGUI形式で、ユーザーにユーザーのHTMLのリストが表示されます。

しかし、私はまた、APIリクエストに対するJSONコンテンツを提供したいと思います:

@app.route('/api/list') 
def api_group_list(): 
    groups_list = get_groups() 
    return jsonify({'groups': group_list}) 

これは動作します - しかし、これは良いアイデアですか?私は2つの質問があります:

1)これは2つの異なるタイプのコンテンツを持っているときにFlaskを使うのに適した方法ですか?ウェブブラウザ用のURLは/endpoint(HTML)、APIリクエスト(JSON)を処理するURLは/api/endpointと同じですか?

2)または、これらの2つのエンドポイントを1つの関数に結合する必要がありますか?それはうまくいくように見えますが、ユーザーがどのエンドポイントにアクセスしたかはどのように判断できますか?つまり、以下の擬似コードを実行できますか?

@app.route('/list') 
@app.route('/api/list') 
def group_list(): 
    groups_list = get_groups() 

    if <user arrived here via the /list endpoint>: 
     return render_template('groups.html', groups=groups_list) 

    elif <user arrived here via the /api/list endpoint>: 
     return jsonify({'groups': group_list}) 
+0

も ​​'?フォーマット= json'のようなもののために、テストをクエリのparamを使用していない場合は、それが存在するか、テンプレートの場合はJSONを返すことができます。個人的には、私はapiルートとhtmlルートのための別々の青写真を保っています。 – reptilicus

+0

私は以前に青写真を調べていませんでした(私は、彼らが私のイントロレベルのスキルを超えて進歩したFlaskのものだと考えましたが)。 –

答えて

1

あなたの2つ目の質問に答えるために:

from flask import request 

@app.route('/') 
@app.route('/json') 
def index(): 
    if request.path == '/json': 
     return {} 
    return render_template('index.html') 

ドキュメントの参照がhereです。

+0

素晴らしい!ちょうど私が必要なもの。 –

0

またそうのように、さまざまな機能への方法でリクエストを分割することができます:私は別のファイル内のAPIとテンプレートへのルートを分割することをお勧めしても、プロジェクトの構造上の理由から

@app.route('/', methods=['GET', 'POST']) 
def index(): 
    if request.method == 'POST': 
     return {} 
    else: 
     return render_template('index.html') 

project 
├── app 
| ├── views.py 
| └── api.py 
└──.....