なにこれ
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)