回答例

お題の回答例です。
回答例のフルソース:http://files.getdropbox.com/u/261861/kaepy.zip
kae.pyだけを見る(推奨):http://gist.github.com/145613

変更した部分

  • app.yamlのappidをkaepyに、gae.pyをkae.pyに
  • gae.pyを名称変更してkae.pyにし、お題にそってソース変更

kae.py解説

まず代表的な部分から。
  • ページ取得部分は、関数にした(DRY)
  • ランダムなidを生成する部分も関数にした
  • いじったのは、ページ取得部分とページ作成部分だけ
なので、ページ取得部分(get_page関数)、ページ作成部分(CreatePageクラス)、ランダム文字列作成部分(random_str関数)、ランダムにページを表示する部分(RandomPageクラス)
だけを解説します。
無駄なところがあるかもしれませんがご了承を。

ランダムな文字列を生成する(random_str関数)

まずはkae.pyの10行目を
def random_str():
  return ''.join([random.choice(string.ascii_letters+string.digits) for i in range(10)])
これ超絶簡単ですね。
空の文字列に,joinでリストを連結します。
連結するリストは、リスト内包表記でこのように展開されます。
a = []
for i in range(10):
  a.append(random.choice(string.ascii_letters+string.digits))
''.join(a)

random.choiceは、渡された文字列から1つ文字を選びます
string.ascii_lettersはa-zA-Z
string.digitは0-9
の文字列です。
それらを会わせたa-zA-Z0-9の文字列から、1つを選んでくっつけます。
['a','1','Z','p','o','1','2','q','2','b']
こんな感じに鳴る訳ですね。
それを、文字列にくっつけたものをreturnします。

ページ作成部分(CreatePageクラス)

kae.pyの75行目を。
postメソッドで普通に作成するのですが、
Pageのパラメータにurlidというのが増えています。これがユニークな文字列を格納するためのプロパティです。
modelにもそうありますね。
そこにいれているのが
random_str()+time.strftime("%s")
ランダムな文字列にUNIX秒的なものをくっつけて入れています。
重複防止です。UNIX病なら重複しないので。
そしたら、put()で保存して、
urlidを/entryに渡して、終了。

Pageを取得する(get_page関数)

kae.pyの12行目を。
これでページを取得してやります。
もしもurlidがなければ(GETパラメータを直接渡すので)、Falseを返却します。
まず、Page.all()ですべて取得し、filterでフィルタをかけます。
もちろんfilterは、渡されたidと、dbに記録されたurlidと一緒か?です。
それで、もしもfilterした結果が0以下なら Falseを返します。
そして、それ以外なら、1番目の結果をかえします。重複することはないのでまあ大丈夫でしょう.

ページをランダムに選ぶ部分(RandomPageクラス)

これは簡単です。
まず、登録されているページ数を数えて、qに代入
1-qの整数で乱数を生成して、モデルのget_by_idメソッドでページを取得、それのurlidを取得して
/entryにurlid付きでリダイレクトします。

まとめ

こっちもお題を出して、締め切り2日前に急ピッチで作ったが
とても早く実装できた!!
いろいろ汚いけど動くからおk
セキュリティとかかんがえてないよ!
某氏から、Tropyに固有なWeb2.0っぽいid持たせるなんて・・・
とか言われたけど気にしないw

以上。ありがとうございました。
---
ソラ(sorah) sora134[at]gmail.com
http://codnote.net/

Comments