GDG四国 GAE/P Code Lab
#gdgshikoku GuestBookクラスを作って(HTTPの)POSTメソッドを扱うため post() を作ります。GETメソッドは対応しません。GETでアクセスすると 405 Method Not Allowed になります。
2013-05-26 10:08:00#gdgshikoku ファイル末尾の webapp2.WSGIApplication で /sign へのアクセスをGuestBookクラスに紐付けます。
2013-05-26 10:08:31Code Labに来てる人のコーディぐ環境。隣の人はMac + Sublime Text 2 + コマンドライン。 僕は結構IDEからやることが多い。
2013-05-26 10:15:10#gdgshikoku 入力された値をDatastoreに保存します。修正内容は https://t.co/pkXgp9WFlX ここ。
2013-05-26 10:15:12#gdgshikoku モデルクラスを作ってそのオブジェクト(インスタンス)でデータの保存をします。入力後は / にリダイレクトして(/ のページで)入力データを表示するようにします。
2013-05-26 10:16:12#gdgshikoku 説明が長いですが順に追います。新しいモジュールをimportします(db)。Greetingクラスがモデルです。
2013-05-26 10:17:56#gdgshikoku content に入力した文字列を保存します(multiline=True で改行許可)。date が入力した日時で、auto_now_add=True オプションで自動的に現在日時が設定されます。
2013-05-26 10:18:19#gdgshikoku / のハンドラ(MainHandler)も大きく変わります。Greeting.all() で全てのデータを取ってきてループで回してひとつずつ表示します。greeting.content で content の中身にアクセスできます。
2013-05-26 10:19:24#gdgshikoku /sign のハンドラ(GuestBook)は新しい Greetingインスタンスを作って greeting.put() で保存します。self.redirect('/') で / にリダイレクトして保存したデータを表示します。
2013-05-26 10:20:21#gdgshikoku 取ってくるときは Greeting.all() 今回は全件取得するのでクエリは指定しません。Javaで言うところの new Greeting() はPythonでは単に Greeting() と呼んでインスタンスを作ります。
2013-05-26 10:22:40#gdgshikoku Q: put() と save() の違いは? ⇒ A: 同じ。put() の方がわかりやすいので save() のエイリアスになっている。
2013-05-26 10:23:23#gdgshikoku Googleの人はHTMLの閉じタグや属性のクォートを省略してデータ転送量を節約している。大量のアクセスをさばくのでそれで結構なコスト削減になっている。
2013-05-26 10:32:36#gdgshikoku データストアは分散データベースなのでエンティティ(実データ)が実際にどこに保存されているかはわからない。取得するときも分散されたデータベースから返ってきた順番に表示するので順番がバラバラになってしまう。クエリのたびに変わることもある。
2013-05-26 10:34:24#gdgshikoku HRD(High Replication Datastore)は複数のデータセンタに非同期で保存するので、データを入れた直後に読みに行くとまだ同期(各データセンタへのコピー)が完了していない場合がある。そうすると入れたばかりのデータが取得できない。
2013-05-26 10:38:10#gdgshikoku Q: HRDの方が高い? ⇒ A: 高いけれど以前のMaster/Slaveはdeprecated。HRDの方が安定している。Master/Slaveはダウンタイムがあったしパフォーマンスが悪かった。
2013-05-26 10:41:40#gdgshikoku 今やっているPython 2.7はHRDのみ。Master/Slaveが使えるPython 2.5もdeprecated。これからはHRD一択。
2013-05-26 10:42:37#gdgshikoku 次はユーザ認証をしましょう。自前でユーザ認証もできるけれどGAEで用意されているGoogleアカウントの認証を使うと簡単。
2013-05-26 10:44:15#gdgshikoku users.get_current_user() を使うとログインしていたらユーザ情報を返します。ログインしていなければNoneになるのでログインURLを作ります(<a href=%s>は乱暴すぎるのでクォートした方がいいでしょう…)
2013-05-26 10:47:12#gdgshikoku RDBMSと違ってDatastoreはスキーマレスなので author を追加しても従来のデータは変わらない。レコードごとにフィールドが異なる場合がある。Datastoreから取ってきたとき author のデータがなければ None となる。
2013-05-26 10:49:58