Help us understand the problem. What is going on with this article?

【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)
XPT60
今どきの若者に置いてかれないように、必死で頑張るおじさんエンジニア。頭の中は幼く、周りから軽く扱われるのが辛い、が仕方ない。 センサー、プログラミング、クラウドなど、趣味やら仕事にも関係しそうなことのメモ。 昔よく勉強したパターン認識(今でいうAIかな)もまとめたい。回転計算や測位技術もそのうちに。宇宙、農業、音楽、気象に興味。仕事で使うクラウドを勉強しなくては。。。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away