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)