search
LoginSignup
6
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【Python】Flask で自作WEB APIにクエリパラメータを渡す

目的

自分で WEB API を提供するサーバを立てたい。そのときに、

http://myserver:5000/sometask&key1=str1&key2=12.34

のように渡す、普通の形で提供したい。

情報源

実装(その1:Flask-RESTfulを使用)

以下で動かしました。flask-restful は pip でインストールしました。

myapi.py
from flask import Flask
from flask_restful import Resource, Api, reqparse

app = Flask(__name__)
api = Api(app)

class TaskAPI(Resource):
    def get(self):

        parser = reqparse.RequestParser()
        parser.add_argument('key1', type=str)
        parser.add_argument('key2', type=float)

        query_data = parser.parse_args()
        print("input_data={}".format(query_data))
        return query_data
api.add_resource(TaskAPI, '/bar', endpoint='bar')

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

Flask-RESTful では、Resource を継承したクラスにgetやpost を実装します。
Flask では返り値をjsonify(data) としましたが、ここでは必要ありません。
実装したクラスをapi に route と共に登録します。
(と、コードを見て理解しています。^^;)

動作確認

まず、上記のコードを動かします。

$ python3 myapi.py

(1) curl で。&の前にバックスラッシュを入れよう。

$  curl http://localhost:5000/bar?key1=val1\&key2=12.34
{
    "key1": "val1",
    "key2": "12.34"
}

(2) ipython で

In [1]: from requests import put, get
In [2]: get('http://localhost:5000/bar?key1=val1&key2=12.34').json()
Out[2]: {'key1': 'val1', 'key2': '12.34'}

(3) ブラウザに入れるとjson が返っているのが分かります。

api.add_resource(TaskAPI, '/bar', endpoint='bar')

実装(その2:Flaskを使用)

じ、実はFlask だけでも同じことができました。m(__)m


from flask import request, Flask, jsonify

app = Flask(__name__)

@app.route('/bar')
def data():
    return jsonify( request.args.to_dict())

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

全てrequestに入れられているんですね。(という解釈^^;)

  • request.args には ImmutableMultiDict([('val1', 'key1'), ('val2', '12.34')])が入っています。
  • request.query_stringとすると、b'val1=key1&val2=12.34'が返ってきます。

自分の場合、なんとなくFlaskだけで良いかも。

まとめ

とりあえず、目的は達成できた。REST API とはそもそも何か、HTTPとは何か、とか、エラー処理や型の確認とか、よりコードを頑健にするなど、残課題はありますが、まずはここまでとする。
 これで明日の仕事は乗り切れるかな。深夜、日付が変わってしまったが。今日はこの辺りで。
(2020/12/06)

追記:

  • Flask だけでもquery parameters を辞書として取得できることを知り、追記。(2020/12/07)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6
Help us understand the problem. What are the problem?