Google App Egine入門ガイド

19168 ワード

Google App Engine    
2008-04-09 20:28
    :
http://code.google.com/appengine/docs/gettingstarted/
   :
[email protected]

( :        ,  !)

( :       ,   1.0.0   1.0.1,
                   ,          )

    

          Google App Engine            。
       “     ”        App Engine  ,
           Google    。

         :
·  
·    
·Hello, World!(  :       )
·  webapp  
·      
·  webapp    
·      
·    
·      
·      

(  :     “#”   ,      “##”   )
#   

    Google App Engine!    App Engine      ,
            。     ,         ,
           ,          。

     ,               ,       
           。        ,        
Google  。
(  :         Google     ?)

              App Engine    ,   App 
Engine   Google      ,             
Python Web  。  Web       App Engine , :webapp。
            Django    。
(  :             “Next”,         ,  )

#     

  Google App Engine           App Engine     (SDK)。

SDK  Web     ,       App Engine  ,          、
Google      URL      App Engine API           Email。
SDK         Python 2.5    ,       Windows、Mac OS X 
Linux。
(  :         App Engine       ?)

      Python 2.5,  Python     (http://www.python.org/)  
            。Mac OS X 10.5 Leopard         Python 2.5。

  App Engine SDK(http://code.google.com/appengine/downloads.html)。
            SDK      。

       ,     SDK      :

·dev_appserver.py,Web     
(http://code.google.com/appengine/docs/thedevwebserver.html)
·appcfg.py,         App Engine
(http://code.google.com/appengine/docs/appcfgpy.html)

Windows Mac OS X                   。
      ,                  。
(  : Windows       )

     SDK Zip    ,   google_appengine         。

# Hello, World!
Google App Engine   Web       CGI      。
(  CGI  :http://hoohoo.ncsa.uiuc.edu/cgi/interface.html)
                ,             
        (  POST    )。    ,          
    ,  HTTP    。
(  :        )

             :      。

##             

      helloworld   。                 。

   helloworld   ,      helloworld.py   ,       :

print 'Content-Type: text/plain'
print ''
print 'Hello, world!'

  Python        ,             HTTP 、    
    “Hello world!”。

##       

App Engine         app.yaml     。
           (handler)      URL。

 helloworld   ,      app.yaml   ,       :

application:helloworld
version:1
runtime:python
api_version:1

handlers:
- url:/.*
script:helloworld.py

    ,                  :
·         “helloworld”。    App Engine         ,
                 ,      。        
      。     ,     “helloworld”。
·   “1”          。            ,App Engine 
       ,                。
·       “python”     。                 。
·    URL              “/.*”(            
URL),    “helloworld.py”     。
(  :                  ,          )
(  :   application     “_”,  “hello_world”   )

        YAML
(http://www.yaml.org/)。
             ,   app.yaml  
(http://code.google.com/appengine/docs/configuringanapp.html)。

##       
                URL      ,          。
       App Engine SDK    Web           。

        Web   ,   helloworld   :

google_appengine/dev_appserver.py helloworld/
(  :           ,          )
(  :   google_appengine   ,  :python dev_appserver.py hellworld,
               ,        1.0.1 ,               )

  Web       ,    8080     。
                     。

http://localhost:8080/

            Web      ,           ,
   Dev Web     
(http://code.google.com/appengine/docs/thedevwebserver.html),
           :--help。

##     

              Web        。
Web            ,           。

   :  Web       ,  helloworld.py  ,    Hello, world!
      。  http://localhost:8080/       。

    Web   ,           ,  Control-C
( Control-Break)。

     Web       ,           。
        ,               。

#   webapp  

CGI      ,                。
Web                ,                  。
Google App Engine       Python     CGI   
(      CGI    WSGI  ),  Django、CherryPy、Pylons web.py。
                  ,              。
(WSGI:http://www.python.org/dev/peps/pep-0333/)
(Django:http://www.djangoproject.com/)
(CherryPy:http://www.cherrypy.org/)
(Pylons:http://pylonshq.com/)
(web.py:http://webpy.org/)

App Engine       Web    ,  :webapp。
webapp       App Engine   SDK ,         ,
              。         ,     webapp。

## Hello, webapp!

  webapp           :
·    RequestHandler ,           
·  WSGIApplication  ,           URL    
·  CGI     WSGIApplication    

         “     ”(  :   Hello world,    ),
    webapp  。
  Helloworld/helloworld.py,            :

import wsgiref.handlers

from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.out.write('Hello, webapp World!')

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

if __name__ == "__main__":
main()
(  :                )

       http://localhost:8080/,            。
(          Web   ,      ,
      “Hello, World!”      )

## webapp    

webapp   google.appengine.ext  。
     SDK   ,         。

            “MainPage”,     URL(/)。
 webapp     HTTP GET URL“/”    ,     MainPage ,
        get  。      ,          self.request
   。  :            self.response   ,    。
webapp MainPage             。

       webapp.WSGIApplication     。
  debug=true      ,  webapp            ,
                         。
           ,        。

       Python    wsgiref     WSGIApplication,   
CGI   。             ,   wsgiref    
(http://docs.python.org/lib/module-wsgiref.html)。

            webapp       。
    webapp     ,   webapp  
(http://code.google.com/appengine/docs/webapp/)。

#       

Google App Engine         ,       Google    ,
( :  infrastructure       ,
             Google          )
    SDK                  。
           (User)  ,            
Google        。
      ,             Google         。

                        。

##     (Users)

    helloworld/helloworld.py,
           :

import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
def get(self):
    user = users.get_current_user()

    if user:
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write('Hello, ' + user.nickname())
    else:
      self.redirect(users.create_login_url(self.request.uri))

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

if __name__ == "__main__":
main()

           。
                Google    ,
              。
                  ,
                     User  。

        App Engine  ,       Google  
     ,     ,           ,
          。

## Users API

              :

user = users.get_current_user()

             ,get_current_user()     
User  。    ,    None。

if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())

        ,          ,       
     。

else:
self.redirect(users.create_login_url(self.request.uri))

        ,  webapp          Google      。
           (self.request.uri),  Google      
                      。

      Users API   ,       
(http://code.google.com/appengine/docs/users/)。

#   webapp    

                ,            
    Web       。
webapp               。

##   webapp  Web  

        helloworld/helloworld.py    :

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
def get(self):
    self.response.out.write("""
      <html>
        <body>
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")


class Guestbook(webapp.RequestHandler):
def post(self):
    self.response.out.write('<html><body>You wrote:<pre>')
    self.response.out.write(cgi.escape(self.request.get('content')))
    self.response.out.write('</pre></body></html>')

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

if __name__ == "__main__":
main()

           ,          。

          (handler):
MainPage,     “/”,    Web  。
Guestbook,     “/sign”,  Web       。

Guestbook      post()  ,   get()  。
    MainPage        HTTP POST  (method="post")
       。
                          GET POST
  ,                     。

post()          self.request     。
        ,   cgi.escape()  HTML       
        。cgi      Python ;  cgi     
    (http://docs.python.org/lib/module-cgi.html)。

  :App Engine       Python 2.5   。
        ,           。
      App Engine             ,
          App Engine       。
        :          、              
            ,        ,     。
            ,  Python    
      (http://code.google.com/appengine/docs/python/)。

#       

     Web     ,          。
            Web       ,
                   ,
                。
   Web           ,
             ,
              。

    Google App Engine,            。
App Engine              、       ,
        API  ,
               。

##        

App Engine  Python     API(data modelling API)。
  Django     API    
(http://www.djangoproject.com/documentation/model-api/)。
        App Engine        。

           ,               。
            、                 ,
                       。

  helloworld/helloworld.py  ,
        import  :

from google.appengine.ext import db

 MainPage          :

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

      Greeting  ,    3   :
author,  User  
content,       
date,  datetime.datetime
(  :datetime   python  ,import datetime; help(datetime))

                      。
  multiline=True   db.StringProperty   
             。
  auto_now_add=True   db.DateTimeProperty   
          ,             ,
             date   。
              ,        
(http://code.google.com/appengine/docs/datastore/)。

                ,           
       Greeting  ,          。
  Guestbook   ,    :

class Guestbook(webapp.RequestHandler):
def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

  Guestbook         Greeting  ,      
         author content  。
      date  ,  date       “now”(  ),
             。

  ,greeting.put()             。
            ,put()       。
                ,
  put()              。

##   GQL        

App Engine         (sophisticated)     
    。  App Engine            ,    
   SQL    。           SQL     ,
     GQL。GQL     App Engine          ,
   SQL    。

  MainPage   ,    :

class MainPage(webapp.RequestHandler):
def get(self):
    self.response.out.write('<html><body>')

    greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")

    for greeting in greetings:
      if greeting.author:
        self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
      else:
        self.response.out.write('An anonymous person wrote:')
      self.response.out.write('<blockquote>%s</blockquote>' %
                              cgi.escape(greeting.content))

    # Write the submission form and the footer of the page
    self.response.out.write("""
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")

       http://localhost:8080/,              
    。

        :

    greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")
(  :       SQL     )

  ,      Greeting  gql(...)  ,
      “SELECT * FROM Greeting”:

    greetings = Greeting.gql("ORDER BY date DESC LIMIT 10")

 SQL  ,   (  “SELECT”)        。
  ,            。
(  :    SQL               )

            ,                 。
   GQL     “SELECT * FROM model”  ,
(      gql  ),
       SQL    。
(  :       model          ,     ?)

(  :  greeting            ,   ?)
   WHERE   GQL                        。
 SQL  ,GQL  “ ”    :  ,GQL             。
  ,             :

    if users.get_current_user():
      greetings = Greeting.gql("WHERE author = :1 ORDER BY date DESC",
                               users.get_current_user())

                 :

      greetings = Greeting.gql("WHERE author = :author ORDER BY date DESC",
                               author=users.get_current_user())

 GQL  ,    API                  。
                :

      greetings = Greeting.all()
      greetings.filter("author =", users.get_current_user())
      greetings.order("-date")

     GQL   API  ,         
(http://code.google.com/appengine/docs/datastore/)。

##           

  Web                        ,
       。
                ,Web           
        。

                     ,        
  --clear_datastore  :

dev_appserver.py --clear_datastore helloworld/

( :       ,     。   ,         ,sorry)

#     

     HTML           ,            。
      ,HTML          ,
                    。
   Python     :EZT、Cheetah、ClearSliver、Quixote Django  。
           ,               。
(EZT:http://svn.webdav.org/repos/projects/ezt/trunk/ezt.py)
(Cheetah:http://www.cheetahtemplate.org/)
(ClearSliver:http://www.clearsilver.net/)
(Quixote:http://www.mems-exchange.org/software/quixote/)
(Django:http://www.djangoproject.com/documentation/templates/)

      ,webapp     Django    。           
SDK App Engine ,                。

##   Django  

    import   helloworld/helloworld.py   :

import os
from google.appengine.ext.webapp import template

        MainPage   :

class MainPage(webapp.RequestHandler):
def get(self):
    greetings = Greeting.all().order('-date')

    if users.get_current_user():
      url = users.create_logout_url(self.request.uri)
      url_linktext = 'Logout'
    else:
      url = users.create_login_url(self.request.uri)
      url_linktext = 'Login'

    template_values = {
      'greetings': greetings,
      'url': url,
      'url_linktext': url_linktext,
      }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

   helloworld       index.html  ,        :

<html>
<body>
    {% for greeting in greetings %}
      {% if greeting.author %}
        <b>{{ greeting.author.nickname }}</b> wrote:
      {% else %}
       An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>
    {% endfor %}

    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>

    <a href="{{ url }}">{{ url_linktext }}</a>

</body>
</html>

      ,    。

template.render(path, template_values)     :            ;
      。       。      Django           ,
           。      ,                 ,
             。

  :  App Engine                、        ,
               。              ,  index.html
              “index.html”。

        Django       ,   Django 0.96    
(http://www.djangoproject.com/documentation/0.96/templates/)。

#       

    Web      ,Google App Engine         
             ,       。        
     index.html,              URL/index.html
   。

  ,             Web         。
  :  、CSS  、JavaScript  、   Flash         
               。     App Engine       
   ,         。

##       

  helloworld/app.yaml,          :

application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /stylesheets
static_dir: stylesheets

- url: /.*
script: helloworld.py

  hanlers         URL    。
 App Engine             /stylesheets    ,
           stylesheets  ,         ,
              。      “/”  ,  
helloworld.py     。

     ,App Engine          MIME         。
          .csss      text/css MIME  。
                MIME  。

URL             app.yaml            。
    ,/stylesheets    /.*            。
     URL     ,      app.yaml     ,
   app.yaml  (http://code.google.com/appengine/docs/configuringanapp.html)。

    helloworld/stylesheets。
       ,       ,  main.css,    :

#body {
# font-family: Verdana, Helvetica, sans-serif;
# background-color: #DDDDDD;
#}
( :css           “#”       )
( :        blog ,css         )
([email protected])

  ,  helloworld/index.html  ,        ,
 <html>   :

# <head>
#    <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
# </head>
( :         “#”)

         ,               。

#       

                App Engine     。
            ID,     SDK       
         。     appcfg.py。

  :     ,        App Enginge    。
         。      ,     3   ID。
               ID,          
  ,               。

##       

     App Engine         App Enginge Web    ,
    :
          http://appengine.google.com

    Google    App Engine。
     Google  ,       E-mail          
Google  (https://www.google.com/accounts/)。

  “Create an Applicatio”           u  。
             ID,           。
          appspot.com  ,           
  :http://application-id.appspot.com/。
                ,            。

  app.yaml  ,    application    :  helloworld  
        ID。
( :                          )

##     

                Google App Engine:

appcfg.py update helloworld/

    (   )     Google      。

                 App Enginge  。
          appspot  ,
      :
   
    http://application-id.appspot.com

##    !
         。
         ,   App Engine  。
(http://code.google.com/appengine/docs/)

([email protected]  )
(   2008.04.23)