zorioの日記 このページをアンテナに追加 RSSフィード

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を更新したりできてしまうのではなかろうかと試したら案の定出来たので、ソースを見てどうしたらいいのかを調べる。

https://code.google.com/p/kay-framework/source/browse/kay/generics/crud.py?r=c88da098d048080fffd9f0acd5c47011a9ee19e8

どうやら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 

だそうだが、オレのmacにはhgが入っていない。

[z@MacBook-Air-2 WorkSpace]$ port echo mercurial
mercurial                       
[z@MacBook-Air-2 WorkSpace]$ sudo port install mercurial
(略)

という感じでまずhgインストール

で、言われたとおりに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先生に尋ねると、

http://stackoverflow.com/questions/1448429/how-to-install-mysqldb-python-data-access-library-to-mysql-on-mac-os-x

で、sudo port install py27-mysql

すると、当然のようにmysqlのtarballをどこかからインストールし始めて、そこから先は新幹線無線LANの貧弱なネットワークでは終わりそうにないので終了。

結局、環境のセットアップだけで終わってしまった。先は長い。

2011-05-20

Chromeの検索のちょっとしたTIPS

chrome://settings/searchEnginesを開く。

その他の検索エンジンに新しい項目を追加。

キーワードは短いのを選ぶと良い。1文字とか2文字とか。

使うときは、検索バーにキーワードを入力してからタブやスペースを押すと、そこの検索になる。

f:id:zorio:20110520112357p:image

aでamazonから商品検索とか、lでldoceとか、よく使いそうなのを登録しておくと便利。

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がホストしてるんだから大丈夫だろうと思うことにしてそのまま公開する。

ちなみにChromeFirefoxでは動いた。IEはどうかなあ。

まあ、こんなの使わなくても、しばらく待ってたらもっと見つけやすくなるんじゃないかと思う。