最近、小物のWeb API開発が結構あって色々な開発方法を試してみていたんだけど、ほぼ最適解と思える物がPython Flaskだった。
Flaskは非常にコンパクトなWebフレームワークで、ほぼ入出力周りと簡単なユーティリティだけで出来ている。
使用も簡単で、PIPで入れられるので
pip install flask
で完了。
ORM経由でMySQLを使ったAPIを書く場合でも
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# -*- coding: utf-8 -*- import os,sys from flask import Flask, jsonify, abort, make_response, request import sqlalchemy from sqlalchemy import Column, Integer, String, orm from sqlalchemy.ext.declarative import declarative_base app = Flask(__name__) app.config['JSON_AS_ASCII'] = False jsonheader = {'Content-Type':'application/json; charset=utf-8', 'access-control-allow-origin':'*'} Base = declarative_base() class User(Base): __tablename__='usertest' id = Column(Integer, primary_key=True) name = Column(String(255)) def __repr__(self): return "<UserTest(name='%s')>"%(self.name) @app.route('/user/list/', methods=['GET']) def list(): engine = sqlalchemy.create_engine("mysql+pymysql://user:password@localhost/database?charset=utf8") Base.metadata.bind=engine sess = orm.sessionmaker(bind=engine)() rslt = sess.query(User).all() ret = [] for item in rslt: ret.append(item.name) resp = make_response(jsonify({'Users':ret, 'Status':'OK'}),200) resp.headers = jsonheader return resp @app.route('/user/add/<string:username>', methods=['GET']) def add(username): engine = sqlalchemy.create_engine("mysql+pymysql://user:password@localhost/database?charset=utf8") Base.metadata.bind=engine sess = orm.sessionmaker(bind=engine)() count = sess.query(sqlalchemy.func.count(User.id)).filter(User.name==username).first() if(count[0]>0): resp = make_response(jsonify({'Status':'USER already exists'}),409) resp.headers = jsonheader return resp else: try: item = User(name=username) sess.add(item) sess.commit() resp = make_response(jsonify({'Status':'OK'}),200) resp.headers = jsonheader return resp except: sess.rollback() finish(ses) resp = make_response(jsonify({'Status':'DB Error'}),500) resp.headers = jsonheader return resp if __name__ == '__main__': app.debug = True app.run(host='0.0.0.0') |
これだけでGET入力、JSON出力の登録・一覧APIが出来上がり。
※ORMはSQLAlchemy、MySQLコネクタはPyMySQLなので、pip install sqlalchemy PyMySQLだけしている。
後は外側にユーザ認証付けたり、機能を肉付けしていけばそれなりの物が出来上がり。
(771)