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だけでもリクエスト処理やユーザビリティが改善します
簡単なので、是非使うことも検討してみてください!

 

 

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA