flask_peeweeのRestAPIでadminユーザーのみに更新を許可する

flask_peeweeのRestAPIで、adminユーザーのみに更新を許可するにはAdminAuthenticationを使用します。

from flaskext.rest import AdminAuthentication

auth = Auth(app, db, user_model=User)

# ユーザー認証をRestAPIに設定する
user_auth = UserAuthentication(auth)
api = RestAPI(app, default_auth=user_auth)


# Userへのアクセスはadminユーザー認証を使用する
admin_auth = AdminAuthentication(auth)
api.register(User, UserResource, auth=admin_auth)


admin=Trueなadminユーザーとadmin=Falseなguestユーザーを用意して、requestsAPIにアクセスしてみます。

{
  "meta": {
    "model": "user",
    "next": "",
    "page": 1,
    "previous": ""
  },
  "objects": [
    {
      "username": "admin",
      "created": "2011-11-15 17:22:50",
      "admin": true,
      "email": "admin@mail.com",
      "active": true,
      "id": 1
    },
    {
      "username": "guest",
      "created": "2011-11-16 17:22:38",
      "admin": false,
      "email": "guest@mail.com",
      "active": true,
      "id": 2
    }
  ]
}
import requests

res = requests.put('http://localhost:5000/api/user/2/', data='{"email": "modified@mail.com"}', auth=("guest","guest"), headers={'Content-Type': 'application/json'})
res
# => <Response [401]>
res.content
# => u'Authentication failed'

guestユーザーでユーザー情報のemailを更新しようとすると、401が返されることがわかります。
adminユーザーだとどうでしょうか

res = requests.put('http://localhost:5000/api/user/2/', data='{"email": "modified2@mail.com"}', auth=("admin","admin"), headers={'Content-Type': 'application/json'})
res
# => <Response [200]>
# => res.content
'{\n  "username": "test",\n  "created": "2011-11-15 17:23:30",\n  "admin": false,\n  "email": "modified@mail.com",\n  "active": true,\n  "id": 2\n}'

adminユーザーはユーザー情報の更新ができました。

蛇足

APIでデータ更新するのに、Content-Typeをわざわざ指定しているのは、requestsでは何も指定しないとapplication/x-www-form-urlencodedが設定され
BadRequestエラーになったためです。

以下はPUTに対応するflask-peeweeのRestAPIのソースですが、request.dataが空文字になってしまい、結果ValueErrorになります

flaskext/rest.py

    def edit(self, obj):
        try:
            data = json.loads(request.data)
        except ValueError:
            return self.response_bad_request()