サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

webapp2でフォームを処理する

ユーザーがあいさつ文を投稿できるようにしたい場合は、ユーザーによってウェブフォームから送信された情報を処理するロジックが必要です。 webapp2 フレームワークを使うとフォームのデータの処理が簡単になります。



Hello World からゲストブックへ

既に作成したHello World アプリを使い回すには、以下を変更してください。:

  • 最上階層の helloworld ディレクトリの名前を guestbookに変更します
  • helloworld.py の名前を guestbook.pyに変更します
  • app.yamlhandlers項目を以下の内容に置き換えます:
app.yaml
View on GitHub
handlers:
- url: /.*
  script: guestbook.app

起動コマンドの引数に新しい guestbookディレクトリを使用し、デベロップメントサーバを再起動します。



webapp2でウェブフォームを処理する

app.yamllibraries項目に以下を追加し、webapp2を使用することを宣言します:

app.yaml
View on GitHub
libraries:
- name: webapp2
  version: latest

guestbook/guestbook.py の内容を以下のように置き換えます:

guestbook.py
View on GitHub
import cgi
from google.appengine.api import users
import webapp2

MAIN_PAGE_HTML = """<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 MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.write(MAIN_PAGE_HTML)

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

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestbook),
], debug=True)

フォームを表示するためにページを再読み込みし、メッセージを送信してみましょう。

今回のバージョンでは二つのハンドラがあります: URL /に紐付けられたMainPageではウェブフォームを表示します。 URL /signに紐付けられたGuestbookではウェブフォームから送信されたデータを表示します。

Guestbook ハンドラーではget()メソッドではなく post() メソッドが実装されています。 これは、 MainPageで表示しているフォームではHTTP POST メソッド(method="post")を使ってフォームデータを送信しているためです。 何らかの理由で、一つのハンドラで同一URLへのGET とPOST を処理する必要がある場合、同一クラス内で各アクションメソッドを定義することができます。

post() メソッドのコードでは、self.requestにアクセスしてフォームデータを取得します。 フォームデータをユーザーへ表示する前に、 cgi.escape() を使ってHTMLの特殊文字を目に見えるようにエスケープ処理します。 cgi は標準のPython ライブラリのモジュールです; 詳細情報については cgiについてのドキュメント を参照してください。

データストアを使用する >>