2011-12-14
■Kayで単語帳アプリでも作ってみる(1)
まあ、チュートリアルに毛が生えたくらいの感じなので、学習用には良いのではないかと。
作成するオブジェクトは2つ。
Card:単語帳の1ページ分。ただ、せっかくの電子データなので、表裏の2面だけでなく、面の数は可変にしたいなと思っている。
Deck:単語帳。Cardの集合を保持する。
こんな感じで、ざっとそれぞれについてのCRUDだけ簡単に作りたいな、と。出来ればRailsのscaffoldみたいなお手軽機能が使えると嬉しいんだけど。
と、ここを見ながら実装。
http://kay-docs-jp.shehas.net/generic_views.html
DeckのCRUDの実装
DeckのModelはこんな感じ。
class Deck(db.Model):
owner = kay.db.OwnerProperty()
name = db.StringProperty(required=True)
description = db.TextProperty()
field_count = db.IntegerProperty()
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
def __unicode__(self):
return self.name
CRUDがそのまま使いたいと言いつつ、Deckを所有するユーザーのフィルタくらいは必要なので、上述のドキュメントで説明されている通りにget_queryを使ってフィルタをかける。
class DeckCRUDViewGroup(crud.CRUDViewGroup):
model = 'base.models.Deck'
form = 'base.forms.DeckForm'
authorize = login_required
def get_query(self, request):
return self.model.all().filter('owner =', request.user.key()).\
order('-created')
これで一覧には出て来なくなったんだが、直リンクを開いたら他のユーザーのDeckを更新したりできてしまうのではなかろうかと試したら案の定出来たので、ソースを見てどうしたらいいのかを調べる。
どうやらauthorizeを実装すればいいらしい。
こんな感じ。
class DeckCRUDViewGroup(crud.CRUDViewGroup):
(略)
def authorize(self, request, operation, obj=None):
if obj and obj.owner != request.user:
from kay.exceptions import NotAuthorized
raise NotAuthorized()
これで、別のユーザーのDeckを編集しようとすると"Access not allowed."と言って死んでくれるようになった。
見るだけなら良いんじゃね?と思うならoperationの引数を見て適宜判断すればいいようだ。
追記:
デプロイした。http://1.zflashcard.appspot.com/deck/list
さらに追記:
login_requiredじゃなくてonly_owner_can_writeを使えば、authorizeとか使わなくても良かった。
http://code.google.com/p/kay-framework/source/browse/kay/generics/__init__.py#37
class DeckCRUDViewGroup(crud.CRUDViewGroup): authorize = only_owner_can_write owner_attr = 'owner'
2011-12-08
■ GAE 1.6.0 とPython 2.7でkayを使おうとする続き
しばらく間が空いて続きをやろうとすると、色々と状況が変わっててアレだな。
Kayのpython 2.7対応の件
http://groups.google.com/group/kay-users-ja/browse_thread/thread/4a968311830ed44
によると、
hg clone https://code.google.com/p/kay-framework/ -b py27
[z@MacBook-Air-2 WorkSpace]$ port echo mercurial mercurial [z@MacBook-Air-2 WorkSpace]$ sudo port install mercurial (略)
で、言われたとおりにkayをインストール。
http://kay-docs.shehas.net/tutorial.html
を見ながらチュートリアルをやってみる。
jinja2が無いと言われて動かない。
[z@MacBook-Air-2 flashcard]$ python manage.py runserver
Running on Kay-1.1.1Traceback (most recent call last): File "manage.py", line 19, in <module>
from kay.management import * File "/Users/z/Dropbox/src/WorkSpace/kay-framework/kay/management/__init__.py", line 20, in <module>
from kay.management.shell import ( File "/Users/z/Dropbox/src/WorkSpace/kay-framework/kay/management/shell.py", line 41, in <module>
from kay.management.utils import print_status
File "/Users/z/Dropbox/src/WorkSpace/kay-framework/kay/management/utils.py", line 15, in <module> import kay.app
File "/Users/z/Dropbox/src/WorkSpace/kay-framework/kay/app.py", line 30, in <module>
from jinja2 import (ImportError: No module named jinja2
jinja2は一体どうやってインストールするべきなのか色々と悩んだりしたが、macportsに普通にあった。
[z@MacBook-Air-2 flashcard]$ port echo *jinja2* py-jinja2 py24-jinja2 py25-jinja2 py26-jinja2 py27-jinja2 [z@MacBook-Air-2 lib]$ sudo port install py27-jinja2 Password: ---> Computing dependencies for py27-jinja2 ---> Dependencies to be installed: py27-markupsafe ---> Fetching archive for py27-markupsafe ---> Attempting to fetch py27-markupsafe-0.15_0.darwin_10.x86_64.tbz2 from http://packages.macports.org/py27-markupsafe ---> Attempting to fetch py27-markupsafe-0.15_0.darwin_10.x86_64.tbz2.rmd160 from http://packages.macports.org/py27-markupsafe ---> Installing py27-markupsafe @0.15_0 ---> Activating py27-markupsafe @0.15_0 ---> Cleaning py27-markupsafe ---> Fetching archive for py27-jinja2 ---> Attempting to fetch py27-jinja2-2.6_0.darwin_10.noarch.tbz2 from http://packages.macports.org/py27-jinja2 ---> Attempting to fetch py27-jinja2-2.6_0.darwin_10.noarch.tbz2.rmd160 from http://packages.macports.org/py27-jinja2 ---> Installing py27-jinja2 @2.6_0 ---> Activating py27-jinja2 @2.6_0 ---> Cleaning py27-jinja2
入ったかどうか確認
[z@MacBook-Air-2 lib]$ python Python 2.7.2 (default, Nov 21 2011, 15:04:09) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import jinja2 >>> ^D
で、やっとチュートリアルの最初のHelloが表示できた。
ヤクの毛を刈っているだけで終わってしまう。
2011-11-14
■ GAEのSDK1.6.0でKayが動かない件
久しぶりにGAEでちょっと遊ぼうと思ったら、Python2.7が使えるようになってたので、そっちを試してみた。
最初は最低限のフレームワークにしようかと思っていたのだが、ModelのCRUDを手で書く辺りで面倒になって挫折。
Kayを使おうと思ったら、そもそもapp_serverが起動しない。
http://groups.google.com/group/kay-users-ja/browse_thread/thread/ab746d86509cd1b9
で解決方法が書いてあった。
http://tategakibunko.blog83.fc2.com/blog-entry-460.html
さらに、python-mysqlをインストールしないといけないらしい。
macportsだとそれはどうするのか、さらにGoogle先生に尋ねると、
で、sudo port install py27-mysql
すると、当然のようにmysqlのtarballをどこかからインストールし始めて、そこから先は新幹線無線LANの貧弱なネットワークでは終わりそうにないので終了。
結局、環境のセットアップだけで終わってしまった。先は長い。
2011-03-17
■ Person Finderに登録してない写真を探す方法
これの件。
http://googlejapan.blogspot.com/2011/03/blog-post_17.html
まだ登録されてない写真を探すのが大変なようなので、探すスクリプトを書いた。
http://blog-imgs-46.fc2.com/z/o/r/zoriorz/picasa.html
GDATA APIで写真のコメントを取ってきて、コメント中に"PF"っていう文字列が入ってなかったら、多分まだ入力していないだろうっていう推測。
一応、ルールに従っていれば、「PF 完了」と入っているはずなのだが、「PFの登録が終りました」とか書いてあったりもするのでゆるく判定することにした。
ちなみにこのやり方は、検索をクライアントで行うことにした段階で間違っていて、本当はサーバサイドで実行して結果はしばらくキャッシュしておくようじゃないとPicasa側の負荷が高くなるんだが、まあGoogleがホストしてるんだから大丈夫だろうと思うことにしてそのまま公開する。
ちなみにChromeとFirefoxでは動いた。IEはどうかなあ。
まあ、こんなの使わなくても、しばらく待ってたらもっと見つけやすくなるんじゃないかと思う。

