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()