Flaskで簡単にAPIのページャ機能を作りました〜
とりあえずコードはこんな感じ
from flask import Flask
from flask.json import jsonify
from flask.globals import request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost/pager'
db = SQLAlchemy(app)
"""
データベースの作成手順は、
1.まず python コンソールで
from app import db でインポートして
2.one-to-manyのデータベースを作成する(直接mySqlで作るか、seqel proなどを使用すると楽です )
3.作成し終わったら、再びpython コンソールで
db.create_all() を叩いて完成!
"""
class Data(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
def to_dict(self):
return {
'id': self.id,
'name': self.name
}
@app.route('/')
def index():
"""
offset は刻み offset=5であれば5刻みでリクエストを処理
一度にリクエストすると、サーバーに負荷がかかり過ぎてしまうので、
1度目のリクエストは offset=0
2度目のリクエストは offset=5
3度目のリクエストは offset=10
のようにリクエストしていけば、APIのページャとして機能する
limitは文字通り上限を設けること
"""
# request のクエリパラムスからoffset部分を取得する
offset = request.args.get('offset', type=int)
# request のクエリパラムスからlimit部分を取得する
limit = request.args.get('limit', type=int)
response = [Data.to_dict(n) for n in Data.query.offset(offset).limit(limit)]
return jsonify({'response': response})
if __name__ == '__main__':
app.run()
コメントとして結構書いてあるので、こんな感じで使えますよーという例をいくつか提示します
何もしない場合
url -> http://localhost:5000/
# 帰ってくるデータ
{
"response": [
{
"id": 1,
"name": "太郎"
},
{
"id": 2,
"name": "一郎"
},
{
"id": 3,
"name": "二郎"
},
{
"id": 4,
"name": "三郎"
},
{
"id": 5,
"name": "金太郎"
},
{
"id": 6,
"name": "武蔵"
},
{
"id": 7,
"name": "john"
},
{
"id": 8,
"name": "david"
},
{
"id": 9,
"name": "matt"
},
{
"id": 10,
"name": "joy"
}
]
}
offsetとlimitをつける場合
url -> http://localhost:5000/?offset=0&limit=5
{
"response": [
{
"id": 1,
"name": "太郎"
},
{
"id": 2,
"name": "一郎"
},
{
"id": 3,
"name": "二郎"
},
{
"id": 4,
"name": "三郎"
},
{
"id": 5,
"name": "金太郎"
}
]
}
# 次の5件をリクエストするには
url - > url -> http://localhost:5000/?offset=5&limit=5
{
"response": [
{
"id": 6,
"name": "武蔵"
},
{
"id": 7,
"name": "john"
},
{
"id": 8,
"name": "david"
},
{
"id": 9,
"name": "matt"
},
{
"id": 10,
"name": "joy"
}
]
}
offsetとlimitだけでもリクエスト処理やユーザビリティが改善します
簡単なので、是非使うことも検討してみてください!