flask_peeweeのRestAPIで返却するパラメータを制御する

モデルに対してCRUD操作をするAPIを提供してくれるflask_peeweeのRestAPIですが、
モデルの情報を取得する際、デフォルトではすべてのパラメータを返します。


http://localhost:5000/api/user/

{
  "meta": {
    "model": "user",
    "next": "",
    "page": 1,
    "previous": ""
  },
  "objects": [
    {
      "username": "admin",
      "admin": true,
      "email": "",
      "active": true,
      "password": "c8ab8$fae67e236bd643be06f5c5a2de800aec3d8651a6",
      "id": 1
    }
  ]
}


passwordなど、返したくない値がある場合は、それをコントロールする方法があります。
コントロールにはRestResourceクラスのサブクラスを作成し、それを利用します。

class UserResouce(RestResource):
    exclude = ('password')

api.register(auth.User, UserResource)


http://localhost:5000/api/user/

{
  "meta": {
    "model": "user",
    "next": "",
    "page": 1,
    "previous": ""
  },
  "objects": [
    {
      "username": "admin",
      "active": true,
      "admin": true,
      "id": 1,
      "email": ""
    }
  ]
}

passwordが返されなくなりましたね!

もちろんid指定してのGETも同じです。

http://localhost:5000/api/user/1/

{
  "username": "admin",
  "active": true,
  "admin": true,
  "id": 1,
  "email": ""
}


全体のソース

import datetime
from flask import Flask, render_template
from flaskext.auth import Auth
from flaskext.admin import Admin, ModelAdmin
from flaskext.db import Database
from flaskext.rest import RestAPI, UserAuthentication, RestResource
from peewee import TextField, DateTimeField, CharField

# configure our database
DATABASE = {
    'name': 'flask_peewee_sample.db',
    'engine': 'peewee.SqliteDatabase',
}
DEBUG = True
SECRET_KEY = 'fjs79djfoew09eufwe3usdfi'

app = Flask(__name__)
app.config.from_object(__name__)

db = Database(app)


# model
class Post(db.Model):
    title = CharField()
    entry = TextField()
    created = DateTimeField(default=datetime.datetime.now)


class PostAdmin(ModelAdmin):
    columns = ('title', 'entry', 'created',)


class UserResource(RestResource):
    exclude = ('password')

# for admin site
auth = Auth(app, db)
admin = Admin(app, auth)
admin.register(Post, PostAdmin)
auth.register_admin(admin)
admin.setup()

# for restapi
user_auth = UserAuthentication(auth)
api = RestAPI(app, default_auth=user_auth)
api.register(Post)
api.register(auth.User, UserResource)
api.setup()

if __name__ == '__main__':
    auth.User.create_table(fail_silently=True)
    Post.create_table(fail_silently=True)

    app.run()