Hatena::Diary

°Å¹æ¡¢¿ô³Ø¡¢»þ¡¹¥×¥í¥°¥é¥ß¥ó¥° ¤³¤Î¥Ú¡¼¥¸¤ò¥¢¥ó¥Æ¥Ê¤ËÄɲà RSS¥Õ¥£¡¼¥É

2008-04-12

ËÜÅö¤Ï¶½Ì£¤Î¤¢¤ë¥¢¥Ê¥¿¤ØÊû¤° (2)¡¡¡Ý Google App Engine

| 08:02 |

¥µ¥é¥ê¡¼¥Þ¥ó¤Î¡ÖÂç¿Í¤Î»ö¾ð¡×¤Ë¤è¤êµ¢Âð¤¬ÃÙ¤¯¤Ê¤Ã¤¿¤¬¡¢Àë¸ÀÄ̤곤­¤ò¥Ý¥¹¥È¤·¤Æ¤«¤é¿²¤ë»ö¤Ë¤·¤è¤¦¤È»×¤¦¡£²¿¤«¤Î´Ö°ã¤¤¤Ç½é²ó¤ò³Îǧ¤»¤º¤ËËÜ¥¨¥ó¥È¥ê¡¼¤ËÍè¤Æ¤·¤Þ¤Ã¤¿Êý¤Ï¡¢¤Þ¤º¤Ï¥³¥Á¥é¤ò¤´³Îǧ¤µ¤ì¤¿¤·¡£¤½¤ì¤Ç¤Ï¡¢°ú¤­Â³¤­ËÜ¥¨¥ó¥È¥ê¡¼¤ò¤ª³Ú¤·¤ß¤¢¤ì¡£¡ÊÆȤê¸À¡§Á°¤Î¥¨¥ó¥È¥ê¡¼¤Î¥Ö¥¯¥Þ¤ÏÁý¤¨¤Æ¤ë¤Î¤Ë¡¢°Õ³°¤Èï¤â¿·¤·¤¤µ­»ö¤Ëµ¤ÉÕ¤¤¤Æ¤¤¤Ê¤¤¥Ã¤Ý¤¤¡£Á°²ó¤Ï¤¿¤Þ¤¿¤ÞÇßÅÄ˾Éפµ¤ó¤Ëµ¤ÉÕ¤¤¤Æ¤â¤é¤Ã¤¿¤«¤é¸«¤Æ¤â¤é¤¨¤¿¥À¥±¤Ê¤ó¤À¤í¤¦¤«¡©¡Ö¸«¤Ä¤±¤é¤ì¤Ê¤±¤ì¤Ð̵¤¤¤Î¤È°ì½ï¡×¤Ã¤Æ¤Î¤Ï¤³¤Î»ö¤À¤Ê¤¡Ž¥Ž¥Ž¥¡Ë

¡Ú4·î12Æü¡§17»þ¡ÊJST)¡¡ºÇ¸å¤Þ¤Ç»Å¾å¤¬¤Ã¤¿¤Î¤ÇÄɵ­¤·¤Þ¤·¤¿¡Û

½àÈ÷¤ÏÎɤ¤¤«¡©


Í褿¤«¡£Á°²ó¤ÏÃæÃǤ·¤Æ¥¹¥Þ¤Ê¤«¤Ã¤¿¤Ê¡£¤À¤¬¡¢º£²ó¤ÏÅÚÆü¤ò»È¤Ã¤ÆÊÙ¶¯½ÐÍè¤ë¤è¤¦¤Ë¡¢¤¿¤Ã¤×¤ê¥á¥Ë¥å¡¼¤òÍÑ°Õ¤·¤Æ¤¢¤ë¤«¤é°Â¿´¤·¤í¡£¤ª¤½¤é¤¯º£²ó¤Î·±Îý¤Ï¥Ï¡¼¥É¤Ê»ýµ×Àï¤Ë¤Ê¤ë¤À¤í¤¦¡£¤À¤¬¤ªÁ°¤Ê¤é½ÐÍè¤ë¡ª ÅÓÃæ¤ÇÀäÂФËÄü¤á¤ë¤Ê¤è¡£

¿å¤ÏÍÑ°Õ¤·¤¿¤«¡© ¤½¤ì¤«¤é¿©ÎÁ»ý»²¤Ç¤â¹½¤ï¤ó¤¬¡¢²Û»Ò¿©¤Ã¤¿¼ê¤Ç¥­¡¼¥Ü¡¼¥É¤Ë¤µ¤ï¤ë¤Ê¤è¡£¤½¤¦¤¤¤¦»þ¤Ë¤Ï¤Á¤ã¤ó¤È³ä¤êȤ»È¤¨¡£

¤è¤·¡£½àÈ÷¤Ï½ÐÍ褿¤ß¤¿¤¤¤À¤Ê¡£

¤Ä¤¤¤Æ¤³¤¤¡ª


webapp ¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤ò»È¤Ã¤Æ¤ß¤ë


¤¤¤­¤Ê¤ê¤Ê¤ó¤À¤¬¡¢É¸½à¤ÎCGI¤Ï¥·¥ó¥×¥ë¤È¤Ï¸À¤¨Á´Éô¤Î¥³¡¼¥É¤ò¼êÆþÎϤǽñ¤¯¤Î¤ÏÌÌÅݤÀ¤È»×¤ï¤ó¤«¡© ¼Â¤ÏWeb¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤Ï¡¢¤½¤¦¤¤¤¦ºÙ¤«¤¤½ê¤ò¼õ¤±»ý¤Ã¤Æ¤¯¤ì¤ë²Ä°¦¤¤¥ä¥Ä¤À¡£¤ª¤«¤²¤Ç²æ¡¹¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó³«È¯¤ÎËܼÁŪ¤ÊÉôʬ¤Ë½¸Ãæ½ÐÍè¤ë¤Ã¤Æ¥ï¥±¤À¤Ê¡£

Google App Engine ¤Ç¤Ï¡¢pure Python¤Ç½ñ¤«¤ì¤¿¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤Ê¤é²¿¤Ç¤â»È¤¨¤ë¡£Åö¤¿¤êÁ°¤À¤¬CGI¤¬Ãý¤ì¤ë¥ä¥Ä¤À¤±¤À¤¾¡£webapp°Ê³°¤ÎÎã¤À¤ÈDjango¤È¤«CherryPy¡¢Pylons¡¢web.py ¤Ê¤ó¤«¤¬¤¢¤ë¤Ê¡£¹¥¤­¤Ê¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤ò¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¥Ð¥ó¥É¥ë¤·¤¿¤±¤ê¤ã¡¢Áª¤ó¤À¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤Î¥³¡¼¥É¤ò¥³¥Ô¡¼¤·¤Æ³ºÅö¥¢¥×¥ê¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤±¤ÐOK¤À¡£

¤Á¤Ê¤ß¤ËApp Engine ¤Ï¼«Á°¤Î´Êñ¤ÊWeb¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤ò»ý¤Ã¤Æ¤ë¡£¤½¤¤¤Ä¤Î̾Á°¤¬webapp¤Ã¤Æ¤¤¤¦¥ï¥±¤À¡£¤³¤ì¤Þ¤Ç¤ªÁ°¤¬¤½¤Î̾Á°¤òÃΤé¤Ê¤«¤Ã¤¿¤Î¤âÅöÁ³¤À¤Ê¡£¤³¤ì¤Ï´û¤ËApp Engine ´Ä¶­¤Ë¤âSDK¤Ë¤â¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤ë¡£¤Ä¤Þ¤ê¡¢¾å¤Ç¸À¤Ã¤¿¤è¤¦¤Êºî¶È¡Ê¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¡Ë¤ÏɬÍפʤ¤¡£¤è¤«¤Ã¤¿¤Ê¡£¤¸¤ã¤¢¡¢webapp¤ò¼ÂºÝ¤Ë»È¤¤¤Ê¤¬¤é¿Ê¤á¤Æ¤¤¤¯¤¾¡£


½Ð¤¿¤Ê webapp


webapp ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ï°Ê²¼¤Î3¤Ä¤Î¥Ñ¡¼¥Ä¤¬¤¢¤ë¡£

  • 1¤Ä°Ê¾å¤Î¥ê¥¯¥¨¥¹¥È¥Ï¥ó¥É¥é¥¯¥é¥¹¡Ê¥ê¥¯¥¨¥¹¥È¤Î½èÍý¤È¥ì¥¹¥Ý¥ó¥¹¤ÎÀ¸À®¤òôÅö¡Ë
  • WSGI¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¤¥ó¥¹¥¿¥ó¥¹¡ÊURL¤Ë½¾¤Ã¤Æ¥ê¥¯¥¨¥¹¥È¤ò¥ë¡¼¥Æ¥£¥ó¥°¤¹¤ë¡Ë
  • ¥á¥¤¥ó¥ë¡¼¥Á¥ó

¤¸¤ã¤¢¡¢À褺¤ÏÁ°²óºî¤Ã¤¿helloworld ¤ò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¥µ¡¼¥Ð¤ò»ß¤á¤Æ¤·¤Þ¤Ã¤Æ¤ë¤Ê¤é¡¢Á°²óÀâÌÀ¤·¤¿ÊýË¡¤ÇºÆµ¯Æ°¤¹¤ì¤Ð¤¤¤¤¤¾¡£¤É¤¦¤À¡©·ë²Ì¤Ï¸«¤ì¤¿¤«¡©


webapp ¤Ï²¿¤ò¤ä¤Ã¤Æ¤¤¤ë¤Î¤«¡©


webapp ¥â¥¸¥å¡¼¥ë¤Ï google.appengine.ext ¥Ñ¥Ã¥±¡¼¥¸¤ÎÃæ¤Ë¤¢¤ë¡£¥³¥¤¥Ä¤Ï¥é¥ó¥¿¥¤¥à´Ä¶­¤ÈƱÍÍSDK¤Ç¤â»È¤¨¤ë¤â¤Î¤À¡£

¤Þ¤º¡¢¾å¤Ç¼¨¤·¤¿¥³¡¼¥É¤Ç¤Ï¥á¥¤¥ó¥Ú¡¼¥¸¡Ê¥ë¡¼¥ÈURL)¤ËÂФ·¤Æ¥Þ¥Ã¥×¤µ¤ì¤¿1¤Ä¤Î¥ê¥¯¥¨¥¹¥È¥Ï¥ó¥É¥é¤òµ¬Äꤷ¤Æ¤¤¤ë¡£¥á¥½¥Ã¥É¤ÎÃæ¿È¤Ï¡¢webapp¤¬¥ë¡¼¥ÈURL¤ËHTTP¤ÎGET¥ê¥¯¥¨¥¹¥È¤ò¼õ¤±¤¿¾ì¹ç¤Ë²¿¤òÊÖ¤¹¤«¡©¤À¡£Ê¬¤«¤ë¤Ê¡© ¥¤¥ó¥¹¥¿¥ó¥¹¤¬¤É¤¦¤Î¤Ã¤ÆÏäϡ¢¤³¤³¤Ç¤Ï´º¤¨¤Æ¤·¤Ê¤¤¤¾¡£Python¤¬¤Þ¤ÀÎɤ¯Ê¬¤«¤é¤ó¥ä¥Ä¤Ï¡¢¤Ò¤È¤Þ¤ºÎ®¤·¤Æ¤ª¤±¡£

¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó¤ÎÃæ¤Ç¡Ödebug=True¡×¤È¤¢¤ë¤Î¤Ï¡¢¥¨¥é¡¼Åù¤ÎºÝ¤Ë¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤òÅǤ­½Ð¤µ¤»¤ëµ¡Ç½¤ò»È¤¦¤«¤É¤¦¤«¤À¡£°ìÈ̤˸ø³«¤¹¤ëÃʳ¬¤Ç¤ÏOFF¤Ë¤·¤¿¤¤¤«¤âÃΤì¤ó¤Ê¡£¤½¤Î¼¡¤Î¹Ô¤Ï¡¢CGI¥Ï¥ó¥É¥é¤ò»È¤Ã¤Æ¼ÂºÝ¤Ë¥á¥¤¥ó¥ë¡¼¥Á¥ó¤ò¼Â¹Ô¤µ¤»¤Æ¤ëÉôʬ¤À¡£

¤³¤Î¥³¡¼¥É¤ÏPythonɸ½à¥é¥¤¥Ö¥é¥ê¤Ë¤¢¤ëwsgiref¥â¥¸¥å¡¼¥ë¤ò»È¤Ã¤Æ¤ë¡£¤³¤ì¤ÏCGI¥¢¥À¥×¥¿¡¼¤ò»È¤¦WSGI¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òÁö¤é¤»¤ë¤¿¤á¤À¡£wsgiref¥â¥¸¥å¡¼¥ë¤Ë¤Ä¤¤¤Æ¤Î¾Ü¤·¤¤¾ðÊó¤Ï¥³¥³¤Ë¤¢¤ë¤«¤é¡¢ÃΤꤿ¤±¤ì¤Ð³Îǧ¤·¤Æ¤ª¤±¡£

¤Á¤Ê¤ß¤Ë¡¢¤³¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤Ï¤â¤¦¾¯¤·webapp¤òÍøÍѤ¹¤ëͽÄê¤À¤¬¡¢webapp¤Ë¤Ä¤¤¤Æ¤â¤Ã¤È¾ðÊó¤¬É¬ÍפȻפ¦¤Ê¤é¥³¥³¤ò³Îǧ¤·¤Æ¤ª¤±¡£


¤Ç¡¢¼¡¤Ï¡Ä¡©

¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤ò»È¤¦¤Èweb¥¢¥×¥ê¤Î³«È¯¤¬¼êÁ᤯´Êñ¤Ë¤Ê¤ë¤À¤±¤Ç¤Ê¤¯¡¢¥ß¥¹Åù¤Î¥¨¥é¡¼¤òÄ㸺¤µ¤»¤ë¥³¥È¤â´üÂÔ½ÐÍ褽¤¦¤À¤Ê¡£¤¿¤À¡¢·«¤êÊÖ¤·¤Ë¤Ê¤ë¤¬webapp¤Ï¤¢¤¯¤Þ¤ÇPython´Ä¶­¤Ç»È¤¨¤ë¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤È¤·¤Æ¸«¤ì¤Ðñ¤Ê¤ëÁªÂò»è¤Î£±¤Ä¤À¤«¤é¤Ê¡£ÀäÂлȤ¦É¬Íפ¬¤¢¤ë¤â¤ó¤¸¤ã¤Ê¤¤¤¾¡£

¤µ¤Æ¡¢helloworld¤ÈÈæ³Ó¤·¤¿¥À¥±¤À¤È¡¢²¿¤¬´ò¤·¤¤¤Î¤«¥¤¥Þ¥¤¥ÁÅÁ¤ï¤é¤ó¤À¤í¤¦¡£Â³¤¤¤Æ¤â¤¦¾¯¤·webapp¤ò»È¤¤¹þ¤ó¤Ç¤¤¤¯¤¾¡£


Users Service ¤ò»È¤Ã¤Æ¤ß¤ë


Google App Engine ¤ÏGoogle¤Î¥¤¥ó¥Õ¥é¤ò¥Ù¡¼¥¹¤È¤·¤¿ÊØÍø¤Ê¥µ¡¼¥Ó¥¹¤ò¥¤¥í¥¤¥í¤ÈÄ󶡤·¤Æ¤¤¤ë¡£¤½¤·¤Æ¡¢¤³¤ì¤é¤Ë¤ÏSDK¤Ë´Þ¤Þ¤ì¤ë¥é¥¤¥Ö¥é¥ê¤ò»È¤¦»ö¤Ç¥¢¥¯¥»¥¹½ÐÍè¤ë¡¢¤Ã¤ÆÏäϤ³¤³¤Þ¤ÇÆɤ߿ʤá¤Æ¤­¤¿¤ªÁ°¤Ê¤é´û¤ËÍý²ò¤·¤Æ¤¤¤ë¤À¤í¤¦¡£

¤³¤³¤Ç¤Ï¡¢¤½¤ÎÃæ¤Î£±¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë Users ¥µ¡¼¥Ó¥¹¤Ë¤Ä¤¤¤Æ¸«¤Æ¤¤¤¯¤¾¡£¥³¥¤¥Ä¤ÏGoogle¥¢¥«¥¦¥ó¥È¤òÍøÍѤ¹¤ë¤¿¤á¤Î¤â¤Î¤À¡£Users¥µ¡¼¥Ó¥¹¤ò»È¤¨¤Ð¡¢¥æ¡¼¥¶¤Ï¥µ¡¼¥Ó¥¹ÍѤ˿·¤·¤¯¥¢¥«¥¦¥ó¥È¤òºî¤é¤Ê¤¯¤Æ¤â¡¢¤½¤Î¤Þ¤Þ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()

Áᮥ֥饦¥¶¤Ç¥ê¥í¡¼¥É¤·¤Æ¤ß¤í¡£¥í¡¼¥«¥ëPCÆâ¤ÎGoogle¥µ¥¤¥ó¥¤¥ó¥Ú¡¼¥¸¤Ë¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤ë¥Ï¥º¤À¡£²¿¤Ç¤â¹¥¤­¤Ê¥æ¡¼¥¶Ì¾¤òÆþ¤ì¤Æ¤ß¤í¡£¤½¤Î¡Ê¥Ë¥»¡Ë¥æ¡¼¥¶Ì¾¤ò¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬Ç§¼±¤·¤¿¤À¤í¤¦¡©

¼ÂºÝ¤Î 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))

¤³¤Ã¤Á¤¬¥µ¥¤¥ó¥¤¥ó¤·¤Æ¤Ê¤¤¾ì¹ç¤Î½èÍý¤À¡£¤³¤Î¾ì¹ç¡¢Google ¥¢¥«¥¦¥ó¥È¤Î¥µ¥¤¥ó¥¤¥óÍÑ¥Ú¡¼¥¸¤Ë¥ê¥À¥¤¥ì¥¯¥È¤¹¤ë¡£¥ê¥À¥¤¥ì¥¯¥È¤Ë¤Ï¼«¿È¤Î¥Ú¡¼¥¸¤ÎURI¡Êself.request.uri¡Ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢Google ¥¢¥«¥¦¥ó¥È¤Î¥µ¥¤¥ó¥¤¥óµ¡¹½¤¬¥µ¥¤¥ó¥¤¥ó¤¹¤ë¤«¥¢¥«¥¦¥ó¥È¤Î¿·µ¬ºîÀ®¤ò¤·¤¿¸å¤Ç¡¢¸µ¤Î¥Ú¡¼¥¸¤ËÌ᤹ºÝ¤ËÍøÍѤµ¤ì¤ë»ö¤Ë¤Ê¤ë¡£

Users API ¤Ë¤Ä¤¤¤Æ¤â¤¦¾¯¤·ÃΤꤿ¤¤¾ì¹ç¤Ï¥³¥³¤ò³Îǧ¤·¤Æ¤ß¤í¡£


¤Ç¡¢¼¡¤Ï¡Ä¡©


¤³¤³¤Þ¤Ç¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¥æ¡¼¥¶¤ò¼±Ê̤¹¤ëµ¡Ç½¤ò»ý¤Ã¤¿¥ï¥±¤À¤¬¡¢¤Þ¤ÀËþ­¤¹¤ë¤Ë¤ÏÁ᤹¤®¤ë¤Ê¡£¼¡¤Ï¥æ¡¼¥¶¤¬ÆþÎϤ·¤¿¥á¥Ã¥»¡¼¥¸¤ò¼õ¤±¼è¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤ë¤¾¡£

¤É¤¦¤·¤¿¡©¡¡¤Þ¤ÀÈè¤ì¤Á¤ã¤¤¤Ê¤¤¤è¤Ê¡©

¤è¤·¡¢¤½¤Î¤Þ¤Þ¤Ä¤¤¤Æ¤³¤¤¡£


webapp ¤ò»È¤Ã¤ÆWeb Form ¤ò½èÍý¤¹¤ë


¥æ¡¼¥¶¤¬ÆþÎϤ·¤¿¥Ç¡¼¥¿¤òPOST¤µ¤»¤¿¤¤¾ì¹ç¡¢Web Form ¤ÇÆþÎϤµ¤ì¤¿¥Ç¡¼¥¿¤ò½èÍý¤Ç¤­¤ëɬÍפ¬¤¢¤ë¤Î¤Ïʬ¤«¤ë¤Ê¡©webapp ¤Ï¤Þ¤µ¤Ë¤½¤¤¤Ä¤ò³Ú¤Ë¤·¤Æ¤¯¤ì¤ë¸­¤¤¥ä¥Ä¤À¡£¤¸¤ã¤¢¡¢¾Ü¤·¤¯¸«¤Æ¤¤¤¯¤¾¡£

Web Form ¤Î½èÍý

Îã¤Ë¤è¤Ã¤Æ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()

Form¤ò³Îǧ¤¹¤ë°Ù¤Ë¥Ú¡¼¥¸¤ò¥ê¥í¡¼¥É¤·¤í¡£¤½¤·¤Æ¡¢²¿¤«¥á¥Ã¥»¡¼¥¸¤òÆþÎϤ·¤Æ¤ß¤í¡£

º£²ó¤ÎÊѹ¹¤Ç¥Ï¥ó¥É¥é¤¬2¤Ä¤Ë¤Ê¤Ã¤¿¤Î¤Ïʬ¤«¤ë¤«¡©1¤Ä¤Ï¥ë¡¼¥È¤ÎURL¤Ë¥Þ¥Ã¥×¤µ¤ì¤¿¥á¥¤¥ó¥Ú¡¼¥¸¡¢¤â¤¦1¤Ä¤ÏURL¡Ö/sign¡×¤Ë¥Þ¥Ã¥×¤µ¤ì¤¿Guestbook ¤À¡£¤³¤¤¤Ä¤¬ Form ¤ËÆþÎϤµ¤ì¤¿¥Ç¡¼¥¿¤òɽ¼¨¤¹¤ë¤Î¤Ë»È¤ï¤ì¤ë¥³¥È¤Ë¤Ê¤ë¡£

¸«¤ì¤Ðʬ¤«¤ë¤È»×¤¦¤¬¡¢Guestbook¥Ï¥ó¥É¥é¤ÏGet¥á¥½¥Ã¥É¤ÎÂå¤ï¤ê¤ËPost¥á¥½¥Ã¥É¤ò»ý¤Ã¤Æ¤ë¤Ê¡£¤³¤ì¤ÏForm¤ÎÆâÍƤòÁ÷¿®¤¹¤ë¤Î¤ËHTTP POST ¤ò»È¤¦¤«¤é¤À¡£¤Á¤Ê¤ß¤Ë¡¢¤Ê¤ó¤é¤«¤ÎÍýͳ¤Ç1¤Ä¤Î¥Ï¥ó¥É¥é¤ËGet¤âPost¤âÂбþ¤¹¤ë¤è¤¦¤Ë¤µ¤»¤¿¤¤¾ì¹ç¤¬¤¢¤ë¤«¤âÃΤì¤ó¡£¤½¤Î¾ì¹ç¤ÏƱ°ì¥¯¥é¥¹¤ÎÃæ¤Ç2¤Ä¤Î¥á¥½¥Ã¥É¤òÀë¸À¤·¤Æ¤·¤Þ¤Ã¤Æ¹½¤ï¤ó¤¾¡£

¤³¤Î¥³¡¼¥É¤ÎÃæ¤Çpost()¥á¥½¥Ã¥É¤Ï self.request ¤«¤éForm ¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë·Á¤Ë¤Ê¤ë¡£¤½¤·¤Æ¥æ¡¼¥¶¤Ë¤½¤ì¤ò¸«¤»¤ëÁ°¤Ëcgi.escape()¤ò»È¤Ã¤ÆHTML¤ÎÆüì¤Êʸ»ú¤ò¥¨¥¹¥±¡¼¥×¤¹¤ë¡£¤Á¤Ê¤ß¤Ëcgi¤È¤¢¤ë¤Î¤ÏPython¤Îɸ½à¥é¥¤¥Ö¥é¥ê¤Ë¤¢¤ë¥â¥¸¥å¡¼¥ë¤À¡£¤³¤Î¥â¥¸¥å¡¼¥ë¤Ë¤Ä¤¤¤Æ¾Ü¤·¤¯ÃΤꤿ¤±¤ì¤Ð¥³¥³¤ò¸«¤Æ¤ª¤±¡£

ɸ½à¥é¥¤¥Ö¥é¥ê¤ÎÏ䬽Ф¿¤«¤é¤Ä¤¤¤Ç¤Ë¸À¤Ã¤Æ¤ª¤¯¤¬¡¢App Engine ´Ä¶­¤¬Python 2.5 ɸ½à¥é¥¤¥Ö¥é¥ê¤ò´Þ¤à¤«¤é¤È¤¤¤Ã¤ÆÁ´¤Æ¤ÎÆ°ºî¤¬µö²Ä¤µ¤ì¤Æ¤ë¥ï¥±¤¸¤ã¤Ê¤¤¤«¤é¤Ê¡£¥µ¥ó¥É¥Ü¥Ã¥¯¥¹¤ÎÏᢳФ¨¤Æ¤ë¤«¡© ¾Ü¤·¤¯Ä´¤Ù¤¿¤±¤ì¤Ð¥³¥³¤ò¥Á¥§¥Ã¥¯¤·¤Æ¤ß¤ë¤ÈÎɤ¤¤¾¡£


¤Ç¡¢¼¡¤Ï¡Ä¡©


¤µ¤Æ¡¢¤³¤³¤Þ¤Ç¤Ç¥æ¡¼¥¶¤«¤é¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë¤È¤³¤í¤Þ¤Ç¤Ï½ÐÍ褿¡£¼¡¤Ï¡¢¼èÆÀ¤·¤¿¥Ç¡¼¥¿¤òÊݸ¤¹¤ë»ö¤ò¹Í¤¨¤Æ¤ß¤ë¤¾¡£

¤É¤¦¤À¡©¡¡¤Þ¤À¤¤¤±¤ë¤«¡©

¤Ê¤Ë¡¢¤ªÁ°¤Ê¤é¤¤¤±¤ë¡£¤Þ¤À¤ä¤ì¤ë¡ª

¤µ¤¡¡¢¼¡¤Ë¹Ô¤¯¤¾¡ª


Datastore ¤ò»È¤Ã¤Æ¤ß¤ë


¥¹¥±¡¼¥é¥Ö¥ë¤ÊWeb¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥Ç¡¼¥¿¤òÊݸ¤¹¤ë¤Ã¤Æ¤Î¤Ï¥È¥ê¥Ã¥­¡¼¤Ê¾ì¹ç¤¬¤¢¤ë¡¢¤Ã¤Æ¤Î¤Ïʹ¤¤¤¿¤³¤È¤¢¤ë¤«¡©¤Þ¤¡´Êñ¤Ë¸À¤¨¤Ð¡¢¥ê¥¯¥¨¥¹¥ÈËè¤ËʪÍýŪ¤Ë°Û¤Ê¤ë¥µ¡¼¥Ð¤ÈÄÌ¿®¤·¤Æ¤ë²ÄǽÀ­¤¬¤¢¤ë¡¢¤Ã¤Æ¥³¥È¤À¤Ê¡£¤À¤¬¡¢Google App Engine ¤Ç¤Ï¤½¤ó¤Ê»ö¤ò°Õ¼±¤¹¤ëɬÍפÏ̵¤¤¡£ ¥í¡¼¥É¥Ð¥é¥ó¥·¥ó¥°¤½¤Î¾½ô¡¹¡¢App Engine ¤Î¥¤¥ó¥Õ¥é¦¤¬¤ä¤Ã¤Æ¤¯¤ì¤ë¥³¥È¤Ë¤Ê¤Ã¤Æ¤ë¤«¤é¤Ê¡£Îɤ«¤Ã¤¿¤Ê¡£


Á÷¿®¤µ¤ì¤¿¥Ç¡¼¥¿¤òÊݸ¤¹¤ë

App Engine ¤ÏPython¸þ¤±¤Î¥Ç¡¼¥¿¥â¥Ç¥ê¥ó¥°API¤ò»ý¤Ã¤Æ¤¤¤ë¤ó¤À¤¬¡¢¥³¥¤¥Ä¤ÏDjango¤Î¥Ç¡¼¥¿¥â¥Ç¥ê¥ó¥°API¤Ë¥ï¥ê¤È»÷¤Æ¤ë¡£App Engine ¤Ç¤Ï΢¤Ç¥¹¥±¡¼¥é¥Ö¥ë¤ÊDatastore¤ò»È¤Ã¤Æ¤ëÅÀ¤Ï°ã¤¦¤ó¤À¤¬¤Ê¡£²¿¡©¡¡»÷¤Æ¤ë¤Ã¤Æ¸À¤ï¤ì¤Æ¤âDjango¤òÃΤé¤Ê¤¤¡©¡¡¤½¤ì¤Ç¤â¤Þ¤¡¤¤¤¤¡£¤¸¤ã¤¢¡¢º£¤Ïµ¤¤Ë¤¹¤ë¤Ê¡£

¤µ¤Æ¡¢¥²¥¹¥È¥Ö¥Ã¥¯¥¢¥×¥ê¤Ç¤Ï¡¢¥æ¡¼¥¶¤«¤éPOST¤µ¤ì¤¿¥Ç¡¼¥¿¤òÊݸ¤·¤¿¤¤¥ï¥±¤À¡£POST¤µ¤ì¤ëÁ´¤Æ¤Î¥Ç¡¼¥¿¤Ï¡ÖÅê¹Æ¼Ô¤Î̾Á°¡×¡Ö¥á¥Ã¥»¡¼¥¸¼«¿È¡×¤½¤·¤Æ¡¢¥Ç¡¼¥¿¤ò»þ·ÏÎó¤Ëʤ٤Æɽ¼¨¤¹¤ë¤¿¤á¤Ë»È¤¦¡Ö¥Ç¡¼¥¿¤òPost¤·¤¿ÆüÉաפ¢¤¿¤ê¤Î¾ðÊó¤ò»ý¤Ä»ö¤Ë¤Ê¤ë¤À¤í¤¦¡£

¤½¤ì¤¸¤ã¤¢¡¢¤Þ¤¿Îã¤Ë¤è¤Ã¤Æhelloworld ¥Ç¥£¥ì¥¯¥È¥ê¤Î helloworld.py ¤ò½ñ¤­Ä¾¤¹¤¾¡£

¤Þ¤º¤Ï1¹ÔÌܤ˰ʲ¼¤Î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)

¥³¥¤¥Ä¤ÏÀè¤Ë¼¨¤·¤¿3¤Ä¤Î¥×¥í¥Ñ¥Æ¥£¤ò´Þ¤à¥á¥Ã¥»¡¼¥¸¥Ç¡¼¥¿¤Î¥â¥Ç¥ë¤Ë¤Ê¤ë¡£¤Þ¤¡¡¢¸«¤¿¤Þ¤Þ¤À¤«¤éÆäËÀâÌÀ¤·¤Ê¤¯¤Æ¤âÂç¾æÉפÀ¤Ê¡©

°ìÉô¤Î¥×¥í¥Ñ¥Æ¥£¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢¿¶¤ëÉñ¤¤¤ò·èÄêÉÕ¤±¤ë°Ù¤Ë¹¹¤Ë¥Ñ¥é¥á¡¼¥¿¤ò¼è¤ë¡£º£²ó¤Î¾ì¹ç¡¢db.String¥×¥í¥Ñ¥Æ¥£¤Ë¤Ä¤¤¤Æ¤Ï¡Ömultiline=True¡×¤È¤¤¤¦¥Ñ¥é¥á¡¼¥¿¤òÍ¿¤¨¤ë»ö¤Ç¡¢Ê£¿ô¹Ô¤Ë¤Þ¤¿¤¬¤ëʸ»ú¤ò³ÊǼ¤¹¤ë»ö¤¬½ÐÍè¤ë»ö¤ò¼¨¤·¤Æ¤¤¤ë¡£¤½¤·¤Ædb.DateTime¥×¥í¥Ñ¥Æ¥£¤Ë¤Ä¤¤¤Æ¤Ï¡Öauto_now_add=True¡×¤È¤¤¤¦¥Ñ¥é¥á¡¼¥¿¤òÍ¿¤¨¤ë»ö¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¿·¤·¤¯¥ª¥Ö¥¸¥§¥¯¥È¤¬À¸À®¤µ¤ì¤¿»þ¤Î»þ´Ö¤ò¼«Æ°Åª¤ËÉÕÍ¿¤¹¤ë·Á¤È¤Ê¤ë»ö¤ò¼¨¤·¤Æ¤¤¤ë¡£¤Á¤Ê¤ß¤Ë¡¢¥×¥í¥Ñ¥Æ¥£¤Î¼ïÊ̤䥪¥×¥·¥ç¥ó¤Î°ìÍ÷¤òÁ´¤Æ³Îǧ¤·¤¿¤¤¾ì¹ç¤Ï¥³¥³¤ò³Îǧ¤¹¤ë¤ÈÎɤ¤¤¾¡£

¤µ¤Æ¡¢¤³¤ì¤Ç¥á¥Ã¥»¡¼¥¸ÍѤΥǡ¼¥¿¥â¥Ç¥ë¤¬´°À®¤·¤¿¥ï¥±¤À¡£¤³¤ì¤ò»È¤Ã¤Æ¥¢¥×¥ê¤Ï¿·¤·¤¤¥á¥Ã¥»¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¤³¤È¤â½ÐÍè¤ë¤·¡¢Datastore¤ËÅÐÏ¿¤¹¤ë¤³¤È¤â½ÐÍè¤ë¡£

¤¸¤ã¤¢¡¢¼¡¤Ï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¥Ï¥ó¥É¥é¤Ï¿·µ¬¤Î¥á¥Ã¥»¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¤â¤Î¤À¡£Åö¤¿¤êÁ°¤À¤¬¤½¤ÎºÝ¡¢³Æ¥×¥í¥Ñ¥Æ¥£¤Î¥Ç¡¼¥¿¤Ï¥æ¡¼¥¶¤¬POST¤·¤¿¤â¤Î¤òÍøÍѤ¹¤ë¡£¤·¤«¤·¡¢ÆüÉÕ¥×¥í¥Ñ¥Æ¥£¤Ï¥»¥Ã¥È¤µ¤ì¤Æ¤Ê¤¤ÅÀ¤ÏÃí°Õ¤·¤Æ¸«¤Æ¤ª¤±¤è¡£¤µ¤Ã¤­ÄêµÁ¤·¤¿Ä̤ꡢ¥µ¡¼¥Ð¦¤Ç¼õ¿®¤·¤¿Æü»þ¤òÆþ¤ì¤ë¤ó¤À¤«¤é¤Ê¡£

ºÇ¸å¤Ë¡¢greeting.put() ¤À¤¬¡¢¤³¤¤¤Ä¤ÏDatastore¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤òÊݸ¤¹¤ë°Ù¤Î¤â¤ó¤À¡£put()¤Ï´û¸¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹¹¿·¤Ë¤Ê¤ë¡£º£²ó¤Î¾ì¹ç¡¢¥³¥ó¥¹¥È¥é¥¯¥¿·Ðͳ¤Çºî¤Ã¤¿¿·µ¬¥ª¥Ö¥¸¥§¥¯¥È¤¬put()¤ò»È¤Ã¤ÆDatastore¤ËÄɲ䵤줿¡¢¤Ã¤Æ¥³¥È¤Ë¤Ê¤ë¥ï¥±¤À¡£Ž¥Ž¥Ž¥¤Ä¤¤¤ÆÍè¤ì¤Æ¤ë¤«¡©


GQL ¤ÇÊݸ¤µ¤ì¤Æ¤ë¥Ç¡¼¥¿¤ò¼è¤ê½Ð¤·¤Æ¤ß¤ë


App Engine ¤Î¥¯¥¨¥ê¥¨¥ó¥¸¥ó¤ÏÈó¾ï¤ËÀöÎý¤µ¤ì¤Æ¤ë¤¾¡£¤è¤«¤Ã¤¿¤Ê¡£¤Á¤Ê¤ß¤ËApp Engine Datastore ¤Ï¥ê¥ì¡¼¥·¥ç¥Ê¥ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤¸¤ã¤Ê¤¤¤«¤é¡¢¥¯¥¨¥ê¤ÏSQL¤ò»È¤ï¤Ê¤¤¡£¾å¤Î¸«½Ð¤·¤âÊ̤ËTypo¤¸¤ã¤Ê¤¤¤¾¡£Âå¤ï¤ê¤ËSQL¥é¥¤¥¯¤ÊGQL¤Ã¤Æ¤Î¤¬ÍÑ°Õ¤µ¤ì¤Æ¤ë¡£GQL¤Ï¤ª¤Ê¤¸¤ß¤Î¹½Ê¸¤Ç App Engine Datastore ¤Ë¥¢¥¯¥»¥¹½ÐÍè¤ë¤¾¡£

¤½¤ì¤¸¤ã¤¡¡¢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>""")

½ÐÍ褿¤«¡©¡¡¤è¤·¡¢¤½¤ì¤Ç¤Ï¥ê¥í¡¼¥É¤À¡£¥ê¥í¡¼¥É¤·¤¿¤é¡¢»î¤·¤Ë¤¤¤¯¤Ä¤«¥á¥Ã¥»¡¼¥¸¤òPOST¤·¤ÆÆ°ºî¤ò³Îǧ¤·¤Æ¤ß¤í¡£¤Á¤ã¤ó¤ÈÁ÷¿®¥Ç¡¼¥¿¤¬É½¼¨¤µ¤ì¤¿¤«¡©

¥¯¥¨¥ê¤Ï¤³¤Î¹Ô¤Çȯ¹Ô¤µ¤ì¤Æ¤ë¤Ê¡£

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

¤¢¤ë¤¤¤Ï¡¢¤³¤ì¤ò¥Á¥ç¥¤¤ÈÊѹ¹¤·¡¢gql(...) ¤ò»È¤Ã¤Æ¤³¤ó¤Ê·Á¤Çɽ¸½¤·¤Æ¤â¹½¤ï¤ó¡£

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

SQL¤ÈƱ¤¸¤¯¥­¡¼¥ï¡¼¥É¡ÊSELECT¤È¤«¤À¤Ê¡Ë¤ÏÂçʸ»ú¾®Ê¸»ú¤Î¶èÊ̤Ϥ·¤Ê¤¤¡£¤¿¤À¤·Ì¾¾Î¤Ë¤Ä¤¤¤Æ¤ÏÂçʸ»ú¾®Ê¸»ú¤ò¶èÊ̤¹¤ë¤«¤é¡¢¤½¤ÎÅÀ¤Ïµ¤¤ò¤Ä¤±¤Æ¤ª¤±¡£

¤½¤ì¤«¤é¥¯¥¨¥ê¤Ï¥Ç¡¼¥¿¥ª¥Ö¥¸¥§¥¯¥È¤Î¼ÂÂΤòÊÖ¤¹¤«¤é¡¢°ìÉô¤Î¥×¥í¥Ñ¥Æ¥£¤òÁªÂò¤¹¤ë¤È¤«¤ä¤Ã¤Æ¤â°Ọ̵̃¤¤¤¾¡£Á´¤Æ¤ÎGQL¥¯¥¨¥ê¤Ï¡ÖSELECT * FROM ¥ª¥Ö¥¸¥§¥¯¥È̾¡×¤Ç»Ï¤Þ¤ë¡£gql()¥á¥½¥Ã¥É¤ò»È¤¦¾ì¹ç¤Ï¾åµ­Îã¤ÎÄ̤ê¤Á¤ç¤Ã¤È°ã¤¦¤¬¡¢¤Þ¤¡¤½¤¦¤¤¤¦ºÙ¤«¤¤¥È¥³¤Ï¤Ä¤Ã¤³¤à¤Ê¡£

GQL¥¯¥¨¥ê¤ÏWHERE¤â»È¤¨¤ë¤¾¡£¤³¤ì¤Ï¡¢¥×¥í¥Ñ¥Æ¥£Ãͤò»È¤Ã¤Æ·ë²Ì¤ò¥Õ¥£¥ë¥¿¥ê¥ó¥°¤¹¤ë¤ä¤Ä¤À¤Ê¡£¤Á¤Ê¤ß¤Ë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¤Ë²Ã¤¨¤ÆDatastore API ¤Ç¤Ï¥á¥½¥Ã¥É¤ò»È¤Ã¤Æ°Ê²¼¤Î¤è¤¦¤Ë¥¯¥¨¥ê¤òÁȤßΩ¤Æ¤ë»ö¤â½ÐÍè¤ë¤¾¡£

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

²¿¡©¡¡ºÇ½é¤«¤é¤½¤ì¤ò¶µ¤¨¤í¤À¤È¡©¡¡¤½¤¦¤¤¤¦º¬À­¤Ç¤ÏÀ褬»ý¤¿¤ó¤¾¡£ÏÓΩ¤Æ20²ó¤À¡ª

¸½¼ÂŪ¤Ê¿ô¤Ë¤·¤È¤¤¤¿¤«¤é¡¢¤Á¤ã¤ó¤È¤ä¤ì¤è¡£

¤½¤ì¤«¤é¡¢GQL¤ä Datastore API ¤Î¾ÜºÙ¤¬ÃΤꤿ¤±¤ì¤Ð¥³¥³¤ò¸«¤Æ¤ª¤±¡£


¡¡³«È¯ÍÑ¥µ¡¼¥Ð¤ÎDatastore¤ò¥¯¥ê¥¢¤¹¤ë


³«È¯ÍÑ¥µ¡¼¥Ð¤Ç¤Ï¥¢¥×¥ê¥Æ¥¹¥ÈÍÑ¤Ë¥í¡¼¥«¥ëÈǤÎDatastore¤ò¥Æ¥ó¥Ý¥é¥ê¤Ê¥Õ¥¡¥¤¥ë¤È¤·¤Æ»ý¤Ã¤Æ¤ë¥ï¥±¤À¤¬¡¢¥³¥¤¥Ä¤Ï¥æ¡¼¥¶¤¬»ØÄꤷ¤Ê¤¤¸Â¤ê¥µ¡¼¥Ð¤¬¾¡¼ê¤Ë¾Ã¤·¤¿¤ê¤Ï¤·¤Ê¤¤¡£

¤Ç¡¢¤½¤Î¾Ã¤·¤¿¤¤¾ì¹ç¤ÎÁàºî¤Ï°Ê²¼¤ÎÄ̤ê¤À¡£¥µ¡¼¥Ðµ¯Æ°¤Î»þ¤Ë--clear_datastore¥ª¥×¥·¥ç¥ó¤ò¤Ä¤±¤í¡£

dev_appserver.py --clear_datastore helloworld/

¤µ¤Æ¡¢¤³¤ì¤ÇGoogle¤Î¥¢¥«¥¦¥ó¥È¤òÍøÍѤ·¤¿¥²¥¹¥È¥Ö¥Ã¥¯¥¢¥×¥ê¤¬½ÐÍè¾å¤¬¤Ã¤¿¥ï¥±¤À¤Ê¡£App Engine ¦¤Ç¾¡¼ê¤Ë¥¹¥±¡¼¥ê¥ó¥°¤ò¤ä¤Ã¤Æ¤¯¤ì¤ë¤«¤é¡¢¤³¤Î¥¢¥×¥ê¤¬²¾¤Ë¿Íµ¤¤¬½Ð¤¿¤È¤·¤Æ¤â¡¢²¿¤«¥³¡¼¥É¤ò¤¤¤¸¤Ã¤¿¤ê¤¹¤ëɬÍפâ̵¤¤¡£¤É¤¦¤À¡©»×¤Ã¤¿¤è¤êÁ᤯½ÐÍ褿¡¼¡¢¤Ê¤ó¤Æ¶Ã¤¤¤Æ¤ë¤ó¤¸¤ã¤Ê¤¤¤«¡©»×¤¦Â¸Ê¬»È¤Ã¤Æ»î¤·¤Æ´¶Æ°¤Ë¿»¤ì¡£

¤·¤«¤·¡¢¤À¡£¤ªÁ°¤Ë¤Ï¤³¤ó¤Ê¤È¤³¤í¤ÇËþ­¤·¤Æ¤â¤é¤Ã¤Æ¤Ïº¤¤ë¡£¤â¤¦°ìÅÙ¥³¡¼¥É¤ò¸«¤Æ¤ß¤í¡£MainPage¥Ï¥ó¥É¥é¤ËHTML¤¬Æþ¤Ã¤Æ¤ë¤À¤í¤¦¡©¡¡¤³¤ì¤Ï¥¢¥×¥ê¤Î¸«±É¤¨¤òÊѤ¨¤¿¤¤¡ª¤Ã¤Æ»þ¤Ë¡¢¤Á¤ç¤¤¤È¥á¥ó¥Æ¥Ê¥ó¥¹¤¬ÌÌÅݤ½¤¦¤À¤È¤Ï»×¤ï¤ó¤«¡©¡¡¤¤¤ä¡¢¤à¤·¤í»×¤¨¡£»×¤ï¤ó¤è¤¦¤Ç¤Ï¥¤¥«¥ó¡£

¤È¡¢¤¤¤¦¥ï¥±¤Ç¼¡¤Ï¥Æ¥ó¥×¥ì¡¼¥È¤ò³Ø¤Ö¤¾¡ª


²¿¡©¡¡¤ªÊ¢°ìÇդǤ¹¡¢¤À¤È¡©

¤Þ¤À¤À¡£¤Þ¤À¤ªÁ°¤Ê¤é¤ä¤ì¤ë¡£

¤µ¤¢¡¢¤¢¤È¾¯¤·¤À¡ª¡¡¤â¤¦¾¯¤·¤À¤±Æ§¤óÄ¥¤ê¤ò¸«¤»¤í¡ª


¥Æ¥ó¥×¥ì¡¼¥È¤ò»È¤Ã¤Æ¤ß¤ë


¥³¡¼¥É¤ÎÃæ¤ËHTML¤òËä¤á¹þ¤à¤Ã¤Æ¤Î¤Ï¡¢¸«±É¤¨¤â°­¤¤¤·¡¢¤É¤¦¤Ë¤â¥á¥ó¥Æ¥Ê¥ó¥¹¤¬ÂçÊѤÀ¤È»×¤ï¤ó¤«¡©¤½¤ó¤Ê»þ¤Ë¤Ï¥Æ¥ó¥×¥ì¡¼¥È¤ò»È¤Ã¤¿Êý¤¬Îɤ¤¤¾¡£¥³¥¤¥Ä¤ÏHTML¤òÊÌ¥Õ¥¡¥¤¥ë¤È¤·¤Æ´ÉÍý¤·¤Æ¤¯¤ì¤ë¸­¤¤¥ä¥Ä¤À¡£Python¤Ë¤Ï¥¤¥í¥¤¥í¤Ê¥Æ¥ó¥×¥ì¡¼¥È¤¬¤¢¤ë¡ÊEZT¡¢Cheetah¡¢ClearSilver¡¢Quixote¡¢¤Ç¡¢Django¤Ê¡Ë¥ï¥±¤À¤¬¡¢¹¥¤­¤Ê¤Î¤òÁª¤ó¤Ç¥Ð¥ó¥É¥ë¤·¤ÆÎɤ¤¤¾¡£

¤È¤¤¤Ã¤ÆÆͤ­Êü¤¹¤Î¤â¥¢¥ì¤À¤«¤é¤Ê¡£¤È¤ê¤¢¤¨¤ºwebapp¥â¥¸¥å¡¼¥ë¤Ë¤¢¤ëDjango¤Î¥Æ¥ó¥×¥ì¡¼¥È¥¨¥ó¥¸¥ó¤ò»È¤Ã¤Æ¤ß¤ë¤Î¤¬Îɤ¤¤ó¤¸¤ã¤Ê¤¤¤«¡©¥³¥¤¥Ä¤ÏSDK¤Ë¤âÆþ¤Ã¤Æ¤ë¤·¡¢ÌÞÏÀApp Engine ¤Ç¤â¥µ¥Ý¡¼¥È¤·¤Æ¤ë¡£¥³¥¤¥Ä¤ò»È¤¦¸Â¤ê¤Ï¡¢²¿¤â°Õ¼±¤¹¤ëɬÍפÏ̵¤¤¤Ã¤Æ¥³¥È¤À¤Ê¡£


¤Ç¡¢Django¥Æ¥ó¥×¥ì¡¼¥È¤ò»È¤Ã¤Æ¤ß¤ë


¤½¤ì¤Ç¤Ï¡¢¤¤¤Ä¤â¤Î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)¤Ï¥Æ¥ó¥×¥ì¡¼¥È¥Õ¥¡¥¤¥ë¤Þ¤Ç¤Î¥Ñ¥¹¤È¡¢template_values¤È¤·¤ÆÀë¸À¤·¤Æ¤ë³Æ¼ïÊÑ¿ô¤ò½èÍý¤·¡¢¼ÂºÝ¤ËɬÍפÊHTML²èÌ̤òÊÖ¤¹·Á¤Ë¤Ê¤ë¡£Django¤Î¥Æ¥ó¥×¥ì¡¼¥È¹½Ê¸¤ò»È¤¦¥Æ¥ó¥×¥ì¡¼¥È¤Ï¡¢³ÆÊÑ¿ô¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¥¢¥¯¥»¥¹²Äǽ¤À¡£¤«¤Ê¤ê¤Î¾ì¹ç¤Ë¤ª¤¤¤Æ¡¢Datastore¥â¥Ç¥ë¥ª¥Ö¥¸¥§¥¯¥È¤òľÀÜÅꤲ¤Æ¤·¤Þ¤¤¡¢¤½¤ì¤ò¼õ¤±¼è¤Ã¤¿¥Æ¥ó¥×¥ì¡¼¥È¦¤Ç¥×¥í¥Ñ¥Æ¥£¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤è¤¦¤Ê·Á¤¬»È¤¨¤ë¤¾¡£

¤Á¤Ê¤ß¤Ë¡¢App Engine ¤Ç¤Ï¥×¥í¥¸¥§¥¯¥È¤À¤í¤¦¤¬¥é¥¤¥Ö¥é¥ê¥â¥¸¥å¡¼¥ë¤À¤í¤¦¤¬¡¢¥¢¥Ã¥×¥í¡¼¥É¤µ¤ì¤¿¤â¤Î¤ÏÆɤ߹þ¤ßÀìÍÑ¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼è¤ê°·¤ï¤ì¤ë¤¾¡£¤½¤ì¤«¤é¡¢¥«¥ì¥ó¥È¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤¬helloworld¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤Ã¤Æ¤ë¤«¤é¡¢¥Æ¥ó¥×¥ì¡¼¥È¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤Î»ØÄê¤Ï¥·¥ó¥×¥ë¤Ë¡Öindex.html¡×¤Ç¹½¤ï¤ó¡£


¤Ç¡¢¼¡¤Ï¡£¡£¡©


¤³¤ì¤ÇưŪ¤ËÀ¸À®¤·¤¿HTML¤òÊÖ¤¹¤È¤³¤í¤Þ¤Ç¥¢¥×¥ê¤¬À®Ä¹¤·¤¿¥ï¥±¤À¤Ê¡£¤·¤«¤·¡¢¤³¤ì¤Ç¤Ï¤Þ¤À½½Ê¬¤¸¤ã¤Ê¤¤¡£²èÁü¤À¤ÎCSS¥¹¥¿¥¤¥ë¥·¡¼¥È¤À¤Î¡¢JavaScript¤À¤Î¡¢¤½¤¦¤¤¤¦¤Î¤¬ÉáÄ̤ÎWeb¥³¥ó¥Æ¥ó¥Ä¤Ê¤éÉáÄ̤ËÆþ¤Ã¤Æ¤ë¤À¤í¤¦¡©º£Å٤Ϥ½¤¦¤¤¤¦¤â¤Î¤ò»È¤¨¤ë¤è¤¦¤Ë¤·¤Æ¤·¤Þ¤¦¤¾¡ª¡¡

¤É¤¦¤À¡©¡¡¤Þ¤¿¥ä¥ëµ¤¤¬½Ð¤Æ¤­¤¿¤«¡©

¤â¤¦¤ªÁ°¤ÏÈè¤ì¤Æ¤ë¤À¤í¤¦¤È¤Ï»×¤¦¡£¤·¤«¤·¡¢¤À¡£¤Þ¤À¸Â³¦¤¸¤ã¤Ê¤¤¤À¤í¤¦¡©

¤Ê¡¼¤Ë¡£¤ªÁ°¤Ê¤é¤Þ¤À¤ä¤ì¤ë¡£¥´¡¼¥ë¤Þ¤Ç¤Ï¤â¤¦¾¯¤·¤À¡£

¤µ¤¡¡¢¼¡¤Ë¹Ô¤¯¤¾¡ª¡¡CSS¥¹¥¿¥¤¥ë¥·¡¼¥È¤ò¿©¤Ã¤Æ¤ä¤ì¡ª


ÀÅŪ¤Ê¥Õ¥¡¥¤¥ë¤ò»È¤¨¤ë¤è¤¦¤Ë¤¹¤ë


Google App Engine ¤ÏÉáÄ̤ÎWeb¥µ¡¼¥Ð¤È¤Ï»ÅÁȤߤ¬°ã¤¦¤«¤é¤Ê¡£Á°²ó¡¢index.html¤Ê¤ó¤Æ¥Õ¥¡¥¤¥ë¤âºî¤Ã¤¿¤¬¡¢¼ÂºÝ¤Ë¡Ö/index.html¡×¤¬½ÐÍè¤Æ¤ë¥ï¥±¤¸¤ã¤Ê¤¤¡£´ðËÜŪ¤Ë¤ÏÀÅŪ¤Ê¥Õ¥¡¥¤¥ë¤È¤·¤Æ¤Ï°·¤ï¤Ê¤¤¤Ã¤Æ¥³¥È¤À¤Ê¡£

¤À¤¬¡¢JavaScript¤Ê¤êCSS¤Ê¤ê²èÁü¤Ê¤ê¡¢¤ä¤Ï¤êÀÅŪ¤Ê¥Õ¥¡¥¤¥ë¤ò»È¤¤¤¿¤¤¥±¡¼¥¹¤Ï¥¤¥í¥¤¥í¤¢¤ë¤À¤í¤¦¡£¤³¤³¤Ç¤Ï¡¢¤½¤Î¤ä¤êÊý¤Ë¤Ä¤¤¤Æ¸«¤Æ¤¤¤¯¤¾¡£


ÀÅŪ¤Ê¥Õ¥¡¥¤¥ë¤ò»È¤¦


¤Þ¤º¤Ï helloworld/app.yaml ¤ò¼¡¤ÎÄ̤ê¤Ë½¤Àµ¤·¤í¡£

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

handlers:
- url: /stylesheets
  static_dir: stylesheets

- url: /.*
  script: helloworld.py

handlers ¥»¥¯¥·¥ç¥ó¤Ë2¤Ä¤Î¥Ï¥ó¥É¥é¤¬¤¢¤ë¤Î¤Ïʬ¤«¤ë¤Ê¡© /stylesheets ¤Ç»Ï¤Þ¤ëURL¤òApp Engine ¤¬¼õ¿®¤·¤¿¾ì¹ç¡¢stylesheets¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë¥Õ¥¡¥¤¥ë¤òŬµ¹¥ì¥¹¥Ý¥ó¥¹¤Ë´Þ¤á¤ë·Á¤Ç»È¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£¤½¤·¤Æ¤³¤Î¥³¡¼¥É¤Î¾ì¹ç¤Ï¡¢Â¾¤Î¥ê¥¯¥¨¥¹¥È¥Ñ¥¿¡¼¥ó¤À¤Èº£¤Þ¤Ç¤É¤ª¤êhelloworld.py ¤Î ½èÍý·ë²Ì¤¬ÊֵѤµ¤ì¤ë¥³¥È¤Ë¤Ê¤ë¤Ê¡£

¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏApp Engine ¥µ¡¼¥Ð¤ÏMIME¥¿¥¤¥×¥Ú¡¼¥¹¤Î³ÈÄ¥»Ò¤ò»È¤¦¡£Î㤨¤Ð³ÈÄ¥»Ò¤¬.css¤Ê¤é¡¢MIME¥¿¥¤¥×¤È¤·¤Ætext/css ¤¬ÉÕÍ¿¤µ¤ì¤ë¥ï¥±¤À¡£¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤ÆÊѤ¨¤ë¥³¥È¤â½ÐÍè¤ë¤¾¡£

¤Á¤Ê¤ß¤ËURL¥Ï¥ó¥É¥é¤Ï¡¢app.yaml Æâ¤Ç¤Îʤӽç¤Ë¤·¤¿¤¬¤Ã¤ÆURL¤òɾ²Á¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤ë¤¾¡£app.yaml¤ò»È¤Ã¤Æ½ÐÍè¤ë»ö¤ò¤â¤Ã¤ÈÃΤꤿ¤±¤ì¤Ð¥³¥³¤ò³Îǧ¤·¤Æ¤ª¤±¡£

¤è¤·¡¢¤½¤ì¤¸¤ã¤¢helloworld¥Ç¥£¥ì¥¯¥È¥êÇÛ²¼¤Ëstylesheets¥Ç¥£¥ì¥¯¥È¥ê¤òºî¤ë¤¾¡£¤Ç¡¢¤½¤ÎÃæ¤Ëmain.css ¤òºî¤Ã¤ÆÊݸ¤·¤í¡£Ãæ¿È¤Ï¤³¤¦¤À¡£

body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}

ºÇ¸å¤Ë¡¢¤³¤Îcss¥Õ¥¡¥¤¥ë¤ò»È¤¦index.html ¤ò¼¡¤Î¤è¤¦¤ËÊÔ½¸¤·¤í¡£

  <head>
    <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
  </head>

¤µ¤¢¡¢¥ê¥í¡¼¥É¤·¤Æ¤ß¤í¡£¥¹¥¿¥¤¥ë¥·¡¼¥È¤ò»È¤Ã¤¿¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤ËÀ¸¤Þ¤ìÊѤï¤Ã¤¿¤«¡©


¤¤¤è¤¤¤è¥¢¥Ã¥×¥í¡¼¥É


¤è¤·¡£¤è¤¯¤³¤³¤Þ¤Ç¤Ä¤¤¤ÆÍè¤ì¤¿¤Ê¡£¤ªÁ°¤ÏËÜÅö¤Ë¤è¤¯´èÄ¥¤Ã¤¿¡ª

¤½¤ì¤Ç¤Ï¡¢¤¤¤è¤¤¤èApp Engine ¤Ë¥¢¥Ã¥×¥í¡¼¥É¤·¤ÆÀ¤´Ö¤Ë¤ªÁ°¤Î´èÄ¥¤ê¤ò¸ø³«¤¹¤ë»þ¤À¡ª

ºÇ½ª¥¹¥Æ¥Ã¥×¡£ÍÑ°Õ¤ÏÎɤ¤¤«¡©¡©

¤Ê¤Ë¡©¡¡¡ÖInvitation¤­¤Æ¤Ê¤¤¤«¤é¡¢ËͤϤɤ¦¤»¥¢¥Ã¥×¥í¡¼¥É¤Ç¤­¤Ê¤¤¡×¤À¤È¡©

¤½¤ì¤¬¤É¤¦¤·¤¿¡©¡¡½ÐÍè¤Ê¤¯¤Æ¤â¸«¤Æ¤ª¤±¡£¸å¤Ç¸«¤è¤¦¤È¤¹¤ë¤È¡¢·ë¹½Ëº¤ì¤ë¤¾¡£


¤¸¤ã¤¢¡¢¤¤¤¯¤¾¡ª¡¡


¥¢¥×¥ê¡¢¤Ä¤¤¤Ë¥¢¥Ã¥×¥í¡¼¥É


ÁᮤÀ¤¬¡¢¥¢¥×¥ê¤Î¥¢¥Ã¥×¥í¡¼¥É¤Ë¤Ï¡¢appcfg.py¤Ã¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¤Î¥Ä¡¼¥ë¤ò»È¤¦»ö¤Ë¤Ê¤ë¡£´ÉÍýÍÑ¥³¥ó¥½¡¼¥ë¤ò·Ðͳ¤·¤Æ¥¢¥×¥êID¤ò¿½ÀÁ¤·¤¿¤é¡¢¤¤¤è¤¤¤è¥¢¥Ã¥×¥í¡¼¥É¤À¡£¤Á¤Ê¤ß¤Ë¡¢¸½»þÅÀ¤Ç¤Ï´ÉÍýÍÑ¥³¥ó¥½¡¼¥ë¤Ë¥¢¥Ã¥×¥í¡¼¥É¤·¤¿¥¢¥×¥ê¤òºï½ü¤¹¤ëµ¡Ç½¤Ï¤Ä¤¤¤Æ¤¤¤Ê¤¤¡£¶áÆüÂбþͽÄê¤ÈGoogle¤Ï¸À¤Ã¤Æ¤ë¤¬¤Ê¡£µ¤¤ò¤Ä¤±¤Æ¤ª¤±¡£¤È¤Ë¤«¤¯¤ª»î¤·´ü´ÖÃæ¤ËÅÐÏ¿¤Ç¤­¤ëID¤Ï3¤Ä¤Þ¤Ç¤À¡£

¤½¤ó¤Ê¥ï¥±¤Ç¡¢¤ªÁ°¤¬¡Ö¤³¤Î¥Á¥å¡¼¥È¥ê¥¢¥ëÍѤÇID¤ò¾ÃÈñ¤·¤Á¤ã¤¦¤Î¤¬ÌÞÂÎ̵¤¤¡×¤Ê¤ó¤Æ¹Í¤¨¤ë¥ä¥ëµ¤¤Ë°î¤ì¤¿¥ä¥Ä¤Ê¤é¤Ð¡¢¡¢¡¢¤¤¤¤¤À¤í¤¦¡£´º¤¨¤Æ¥¢¥Ã¥×¥í¡¼¥É¤Ï¤»¤º¡¢¤¿¤À¤³¤ì¤òÆɤᡣ


¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òÅÐÏ¿¤¹¤ë

¤Þ¤º¤ÏID¤Î¿½ÀÁ¤À¡£App Engine ¤Î´ÉÍýÍÑ¥³¥ó¥½¡¼¥ë¤Ç¤¢¤ë°Ê²¼¤Î¥µ¥¤¥È¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¾¡ª

http://appengine.google.com/

¤½¤·¤Æ¤ªÁ°¤ÎGoogle¥¢¥«¥¦¥ó¥È¤Ç¥µ¥¤¥ó¥¤¥ó¤·¤í¡£¤³¤³¤Þ¤ÇÆɤó¤Ç¤ª¤¤¤Æ¤Þ¤ÀGoogle¥¢¥«¥¦¥ó¥È¤¬Ìµ¤¤¤Ã¤Æ¥³¥È¤â¤Ê¤¤¤À¤í¤¦¤¬¡¢Ìµ¤¤¤Ê¤é»öÁ°¤Ëºî¤Ã¤Æ¤ª¤±¤è¡£

¤¤¤è¤¤¤è¼ê³¤­¤ËÆþ¤ë¤¾¡£¤Þ¤º¤Ï¡ÖCreate an Application¡×¥Ü¥¿¥ó¤ò¥¯¥ê¥Ã¥¯¤·¤í¡£¤Ç¡¢¤¢¤È¤ÏÀâÌÀ¤Ë¤·¤¿¤¬¤Ã¤ÆID¤òÅÐÏ¿¤¹¤ë¤À¤±¤À¡£¤ªÁ°¤¬appspot.com¤Î¥É¥á¥¤¥ó̾¤ò»È¤¦¤Ê¤é¡¢¤ªÁ°¤Î¥¢¥×¥ê¤ÎURL¤Ïhttp://application-id.appspot.com/¡¡¤Ã¤Æ¥³¥È¤Ë¤Ê¤ë¡£application-id ¤ÎÉôʬ¤ò¥¢¥×¥êÍѤ˹ØÆþ¤¹¤ë»ö¤â½ÐÍè¤ë¤·¡¢¤ªÁ°¤¬´û¤Ë»ý¤Ã¤Æ¤ë¤â¤Î¤ò»È¤¦»ö¤â½ÐÍè¤ë¤¾¡£

¤½¤¦¤½¤¦¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥óID¤ò¼èÆÀ¤·¤¿¤é¡¢app.yaml¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤¹¤ë¤Î¤ò˺¤ì¤ë¤Ê¤è¡£


¥¢¥Ã¥×¥í¡¼¥É¡ª

¥¢¥Ã¥×¥í¡¼¥É¤Ë¤Ï¼¡¤Î¥³¥Þ¥ó¥É¤ò»È¤¨¡£

appcfg.py update helloworld/

¤½¤·¤Æ¡¢¼¡¤Ë¥×¥í¥ó¥×¥È¾å¤ÇGoogle ¤Î¥¢¥«¥¦¥ó¥È¤È¥Ñ¥¹¥ï¡¼¥É¤òÆþÎϤ·¤í¡£

¤½¤¦¤¹¤ì¤Ð¤Û¤é¡¢ºî¶È¤Ï´°Î»¤À¡ª¡ª¡ª¡ª


¤Ä¤¤¤Ë¥Á¥å¡¼¥È¥ê¥¢¥ëÀ©ÇÆ


¤³¤³¤Þ¤ÇËÜÅö¤Ë¤ªÁ°¤ÏÎɤ¯´èÄ¥¤Ã¤¿¡ª¡¡Â´¶È¤ª¤á¤Ç¤È¤¦¡ª¡ª

¤³¤ì¤Ç¤ªÁ°¤âGoogle App Engine »È¤¤¤À¡£¤Þ¤À¤Þ¤À¥Ò¥è¤Ã»Ò¤À¤¬¤Ê¡£

¤³¤ì¤«¤é¤Ï¤ªÁ°¤ÎÎϤÇÆ»¤òÀڤ곫¤¤¤Æ¤¤¤«¤Í¤Ð¤Ê¤é¤ó¡£

¤À¤¬¡¢¤Ê¤Ë¡¢¤³¤³¤Þ¤ÇÍè¤ì¤¿¤ªÁ°¤Ê¤é¤­¤Ã¤È½ÐÍè¤ë¡ª

À¤´Ö¤ò¡Ö¤¢¤Ã¡×¤È¸À¤ï¤»¤ë¥¢¥×¥ê¤òºî¤Ã¤Æ¸«¤»¤í¡£

²¶¤Ë¤ÏÎé¤ÏÍפé¤ó¡£¤½¤ÎÂå¤ï¤ê¡¢º£Å٤ϤªÁ°¤¬Â¾¤Î¿Íã¤ò½õ¤±¤Æ¤ä¤ì¡£Ãμ±¤Î½Ð¤·Àˤ·¤ß¤Ê¤ó¤Æ¤¹¤ë¤ó¤¸¤ã¤Ê¤¤¤¾¡£¤ªÁ°¤ÎÀ®²Ì¤òÌܤˤ¹¤ëÆü¤ò³Ú¤·¤ß¤Ë¤·¤Æ¤ë¤«¤é¤Ê¡£

¿É¤¯¤Ê¤Ã¤¿¤é¤Þ¤¿¥³¥³¤ËÍ褤¡£²¿¤«¤Þ¤¿¤ªÁ°¤ËÌòΩ¤Ä¾ðÊ󤬤¢¤ë¤«¤âÃΤì¤ó¤«¤é¤Ê¡£

¤À¤¬¡¢¤ªÁ°¼«¿È¤Î­¤ÇÊ⤯»ö¤ò˺¤ì¤Á¤ã¥¤¥«¥ó¤¾¡£

¤½¤ì¤Ç¤ÏºÇ¸å¤Ë¤Ê¤ë¤¬¡£¡£Â´¶È¤ª¤á¤Ç¤È¤¦¡ª¡ª

¤ª¤È¤Ê¤êÆüµ­