どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

Flaskでrest apiを作ってみる

f:id:nogawanogawa:20190326203754p:plain

「いまどきのWeb開発(サーバーサイド編)」ってことで、Rest APIをやってみようと思います。

「Vue勉強してんだからLaravelやれよ」ってまさかりが飛んできそうですが、php使ったこと無いので、、、←
「初心者はRailsじゃね?」ってのも言われましたが、Ruby使ったこと無いので、、、←

ってことで、Python系のDjangoをやってみようかと思ってたんですが、知人にFlaskのほうが簡単と教えてもらったので、 Flaskについて勉強してみます。

参考にさせていただいたのはこちら。

medium.com

qiita.com

Flaskとは

Flask(フラスコ)は、プログラミング言語Python用の、軽量なウェブアプリケーションフレームワークである。標準で提供する機能を最小限に保っているため、自身を「マイクロフレームワーク」と呼んでいる。

(出典:wikipedia)

早い話が、軽量化・シンプルなPythonウェブアプリケーションフレームワークですね。

Vueもそうですが、日本語訳された親切なユーザーガイドがあるのはポイント高いですね。

a2c.bitbucket.io

基本的な使い方

早速使ってみます。

環境構築 

インストールはこちら。

pip3 install flask

バージョンも上げときましょうか。

pip3 install --upgrade flask

こんなもんです。

Hello World

書いてあるとおりにHello Worldをやってみます。

こんなファイルを用意します。

from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/hello')
def hello_world():
    return jsonify({'message': 'Hello, world'}) 

コードはこんだけ。 あとはサーバーを起動します。

FLASK_APP=hello.py flask run

そしたらサーバーが立ち上がります。

あとは普通にcurlでリクエスト投げてみます。

~ $curl localhost:5000/hello
{"message":"Hello, world"}

...超簡単ですね。

ルーティング

今度はend pointで動作を切り替えます。

今回はエンドポイントを/foo/barにしています。 そこに対してGETメソッドの場合と、POSTメソッドの場合で挙動を切り替えます。

from flask import Flask
app = Flask(__name__)

@app.route('/foo')
def get_foo():
    return 'foo\n'
@app.route('/bar')
def get_bar():
    return 'bar\n'
@app.route('/foo/bar/<int:baz>', methods=['POST'])
def post_foobar(baz):
    return 'you posted {}\n'.format(baz)

動かすとこんな感じ。

~ $curl localhost:5000/foo
foo
~ $curl localhost:5000/bar
bar
~ $curl -X POST localhost:5000/foo/bar/1
you posted 1
~ $

...超簡単ですね。(2回目)

JSONの受け渡し

今度はJSONを受け取ってみます。

from flask import Flask, request, jsonify
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False  # JSONでの日本語文字化け対策

@app.route('/', methods=['POST'])
def post_json():
    json = request.get_json()  # POSTされたJSONを取得
    return jsonify(json)  # JSONをレスポンス

@app.route('/', methods=['GET'])
def get_json_from_dictionary():
    dic = {
        'foo': 'bar',
        'ほげ': 'ふが'
    }
    return jsonify(dic)  # JSONをレスポンス

こんな感じですね。

~ $curl -X POST -H 'Content-Type:application/json' -d '{"data":"fuga"}' localhost:5000/
{"data":"fuga"}

...超簡単ですね。(3回目)

感想

めちゃくちゃ簡単ですね。 普通にメソッド定義して、そのままエンドポイント指定すれば使えるんすね。 超簡単です。

引き続き勉強したいと思います。