Edited at

【Python】FlaskでAPIをさくっとつくる

More than 3 years have passed since last update.


なにこれ

DBを使いつつ、ちょこっとしたAPIをさくっと作りたいときありますよね。

そういう時、Flaskが便利です。

基本的に以下のコードに肉付けしていくだけで、APIがつくれますよん


注意

個人的な意見として、中規模なプロジェクトだったり、flask-*を後で追加しまくったり、DBをガッツリ使うのであればDjango等のフレームワークを使ったほうが良いと思います。

後々、別のフレームワークに移す予定があるならもうそっちをつかっちゃいましょう。


コード

Modelに対してCRDを提供するAPIを以下に示しました。 

(Updateは気が向いたら後で実装します)


  • db.session.commit()が呼び出されると実際のDBへ反映されます

  • 失敗した場合、自動でロールバックされるっぽいです

# coding: utf-8

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/postgres'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

# Model
class Model(db.Model):
__tablename__ = 'models'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)

def to_dict(self):
return dict(
id=self.id,
name=self.name
)

def __init__(self, name):
self.name = name

def __repr__(self):
return '<Model {}>'.format(self.name)

@app.route("/api/v1/model/<id>", methods=['DELETE'])
def api_v1_model_id(id):
if request.method == 'DELETE':
d = Model.query.get(id)
db.session.delete(d)
db.session.commit()
return '', 204

@app.route("/api/v1/models", methods=['GET', 'POST'])
def api_v1_models():
if request.method == 'POST':
name = request.json['name']
d = Model(name)
db.session.add(d)
db.session.commit()
return jsonify(d.to_dict()), 201
if request.method == 'GET':
ls = Model.query.all()
ls = [l.to_dict() for l in ls]
return jsonify(ls), 200

if __name__ == "__main__":
db.drop_all()
db.create_all()
app.run(host='0.0.0.0', port=3001)