たまたまkii cloudを使う機会があってサーバーはpyramidで作っていたのでpython3向けのライブラリを書きました。
既に他に作っている人のライブラリはあったんですがpython3のシンタックスで書き直したかった為ゼロから書きました。
enumを使用しているので3.4以上じゃないと動きません。
公式ドキュメントに出来るだけ沿って書いているのがウリです。
メソッド名もドキュメントと全く同じにしてあります。
あとQuery for objectsがSQLAlchemyっぽく引けるのもウリです。
まだ全ての機能が実装できておらず特にACL周りは全く対応していないのでこれからちょっとずつやっていく予定です。
インストール方法
$ git clone https://github.com/ta2xeo/python3-kii
$ python setup.py install
使用方法
>>> from kii import KiiAPI, KiiAdminAPI
>>> api = KiiAPI(app_id, app_key, region='JP') # 通常ユーザー向け
>>> admin_api = KiiAdminAPI(app_id, app_key, client_id, client_secret, region='JP') # 管理者向け
管理者向けと分けてあるのはusersスコープのmeリテラルでアクセスすることを禁止する為です。
アクセストークンのみでは通常ユーザーと管理者を区別することが(多分)出来ない為このような方法を取っています。
生成したインスタンスには各Managementへの属性が用意されていてそれを経由することで実行できます。
>>> api.users # http://documentation.kii.com/rest/#user_management
<kii.users.Users object at 0x1020424a8>
>>> api.groups # http://documentation.kii.com/rest/#group_management
<kii.groups.Groups object at 0x1020590f0>
>>> api.buckets # http://documentation.kii.com/rest/#data_management
<kii.buckets.Buckets object at 0x102059198>
# 例えばCreate a user and obtain access tokenなら
>>> user = api.users.create_a_user_and_obtain_access_token(login_name='qiita', password='test1234')
>>> user
<kii.results.UserResult at 0x105e790b8>
>>> user.access_token
'Sasdfe2wov5ofKLKflmsdwe8L93I20tflkjjoil'
>>> user.login_name
'qiita'
>>> user.password
AttributeError: 'UserResult' object has no attribute 'password'
ドキュメントと同じにしているせいでメソッド名がかなり長いのですがわかりやすいとは思うのでこのようにしています。
一部ショートカットを用意してたりもしますが利便性を考え今後はもっと増やすかもしれません。
バケットの基本操作について
>>> api.buckets.application # Application Scope
>>> api.buckets.group # Group Scope
>>> api.buckets.user # User Scope
>>> test = api.with_access_token(user.access_token).buckets.application('test') # application scopeのtestというbucket名
>>> obj = test.create_an_object({'key': 'value'})
>>> obj
<kii.results.CreateResult at 0x103d4f2b0>
>>> obj.object_id
'b3c33b20-8761-11e4-acf1-55666a765afd'
>>> same = test.retrieve_an_object(obj.object_id) # オブジェクトの取得
>>> body = 'plain text'
>>> same.add_or_replace_body(body, 'text/plain') # bodyへのアップロード
# 結果として取得したオブジェクトのメソッド名は少し短くなっています。
クエリを使用した検索について
>>> from kii import Clause, RangeClause
>>> eq = Clause.eq('_id', 'object_id')
>>> result = test.query(eq).one()
>>> and_ = Clause.and_(Clause.eq('from', 'Tokyo'), RangeClause('age').ge(20))
>>> result = test.query(and_).all()
>>> result_by_order = test.query(and_).order_by('age').all()
>>> result_limit = test.query(and_).limit(5).all()
ドキュメントはまだ用意していないのでサンプルはテストコードを見てもらうのが一番早いと思います。