2013-03-03 17 views
16

URLコールで複数のパラメータがある場合、フラスコを書き込むにはどうすればよいですか?ここに私のURLがあります。私はAJAXから電話していますFlaskでの複数のパラメータが近似

  http://0.0.0.0:8888/createcm?summary=VVV&change=Feauure 

私はこのように私のフラスコを執筆しようとしていました。

   @app.route('/test/<summary,change> ,methods=['GET'] 

しかし、これは機能しません。どのように私はaprouteを言及する方法を提案することができますか?

答えて

4

URLパラメータとURL自体が混在しています。

request.args.get("summary")request.args.get("change")でURLパラメータにアクセスできます。

14

ルートは、メソッドに直接渡されるクエリ文字列と一致しません。

from flask import request 

@app.route('/createcm', methods=['GET']) 
def foo(): 
    print request.args.get('summary') 
    print request.args.get('change') 
+1

これは間違っています。foo()に 'request'を引数として渡すべきではありません。適切なxiaopengs答えを確認してください。 – kramer65

+2

上記のコメントは、編集時の回答として、執筆時には間違っています。 – Doormatt

6
@app.route('/createcm', methods=['GET']) 
def foo(): 
    print request.args.get('summary') 
    print request.args.get('change') 
9

あなたはこれを試すことができます。

---カール要求---

curl -i "localhost:5000/api/foo?a=hello&b=world" 

---フラスコサーバ---

from flask import Flask, request 

app = Flask(__name__) 


@app.route('/api/foo/', methods=['GET']) 
def foo(): 
    bar = request.args.to_dict() 
    print bar 
    return 'success', 200 

if __name__ == '__main__': 
    app.run(debug=True) 

- - コンソール出力---

{'a': u'hello', 'b': u'world'} 

P.S. 「カールオプションを使用して、またはそれはcuzをLinux上で動作していない( 『)』二重引用符を省略して、あなたの要求URLで&」

1

ないでください:http://0.0.0.0:8888/createcm?summary=VVV&change=Feauure、エンドポイントが/createcmあると?summary=VVV&change=Feauureは、要求のargs一部です。あなたはこれを試すことができます。

from flask import Flask, request, jsonify 

app = Flask(__name__) 

@app.route('/createcm', methods=['get']) 
def create_cm(): 
    summary = request.args.get('summary', None) # use default value repalce 'None' 
    change = request.args.get('change', None) 
    # do something, eg. return json response 
    return jsonify({'summary': summary, 'change': change}) 


if __name__ == '__main__': 
    app.run(debug=True) 

httpie例:あなたは確かに、クエリのparamsを使用したい場合は

http get :5000/createcm summary==vvv change==bbb -v 
GET /createcm?summary=vvv&change=bbb HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Host: localhost:5000 
User-Agent: HTTPie/0.9.8 



HTTP/1.0 200 OK 
Content-Length: 43 
Content-Type: application/json 
Date: Wed, 28 Dec 2016 01:11:23 GMT 
Server: Werkzeug/0.11.13 Python/3.6.0 

{ 
    "change": "bbb", 
    "summary": "vvv" 
} 
9

は、他の回答には、正しい解決策を持っています。何かのように:

@app.route('/createcm') 
def createcm(): 
    summary = request.args.get('summary', None) 
    change = request.args.get('change', None) 

いくつかのメモ。 GETリクエストのみをサポートする必要がある場合は、ルートデコレータにメソッドを含める必要はありません。

クエリパラメータを説明します。 "?"あなたの例では、クエリのparamと呼ばれます。 FlaskはそれらのクエリパラメータをURLから取り出し、それらをImmutableDictに配置します。 request.argsでアクセスできます。キーはrequest.args['summary']です。またはgetメソッドIと他のコメント作成者が記述したものです。これにより、存在しない場合に、デフォルト値(Noneなど)を付与する追加機能が提供されます。これは多くの場合オプションであるため、クエリパラメータには一般的です。

ここでは、あなたの例で一見しようとしていたもう1つのオプションがあります。これは、パスパラメータを使用することです。これは次のようになります。

@app.route('/createcm/<summary>/<change>') 
def createcm(summary=None, change=None): 
    ... 

ここでURLは次のようになります http://0.0.0.0:8888/createcm/VVV/Feauure

VVVとFeauureを変数として、あなたの関数に渡されると。

希望に役立ちます。