Twitterもどきを作りながらGoogle App Engineの肝データストアを理解する

白石俊平(あゆた)
2008-04-14 17:00:00
  • このエントリーをはてなブックマークに追加

リスト1:builder-example3.py

import os
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import db,webapp
from google.appengine.ext.webapp import template

class Message(db.Model):
    author = db.UserProperty()
    content = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if self.request.get("myMessageOnly"):
            if not user:
                self.redirect(users.create_login_url(self.request.uri))
                return
            # GQLを用いた問い合わせ
            messages = db.GqlQuery("SELECT * FROM Message"
                                   " WHERE author = :author"
                                   " ORDER BY date DESC LIMIT 20", author=user)

        else:
            # Queryのメソッドを用いた問い合わせ
            messages = Message.all().order("-date").fetch(20)
        if not user:
             login_or_out = "Log in"
             url = users.create_login_url(self.request.uri)
        else:
            login_or_out = "Log out"
            url = users.create_logout_url(self.request.uri)
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(
            template.render(path, {"messages": messages,
                                   "login_or_out": login_or_out,
                                   "url": url}))

class AddMessage(webapp.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if not user:
            loginUrl = users.create_login_url(self.request.uri)
            self.redirect(loginUrl)
            return
        else:
            content = self.request.get("content")
        # メッセージの保存
            message = Message(author=user,
                              content=content)
            message.put()
            self.redirect("/")

def main():
    application = webapp.WSGIApplication(
        [('/', MainPage),
         ('/add', AddMessage)],
        debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
    main()

リスト2:index.html (画面のテンプレート)






  {{login_or_out}}
  
メッセージ:

すべてのメッセージ あなたのメッセージのみ {% for message in messages %} {% endfor %}
{{message.author}}曰く: 「{{message.content|escape}}」 - {{message.date}}

リスト3:app.yaml # アプリケーションの名称 application: builder-example3

# アプリケーションのバージョン
version: 1

# ランタイムの名称。現時点では「python」のみ
runtime: python

# アプリケーションが前提としているAPIのバージョン
api_version: 1

# URLと、その処理方法の定義
handlers:
- url: /.*
  script: builder-example3.py
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]