ユーザーがあいさつ文を投稿できるようにしたい場合は、ユーザーによってウェブフォームから送信された情報を処理するロジックが必要です。
webapp2
フレームワークを使うとフォームのデータの処理が簡単になります。
既に作成したHello World アプリを使い回すには、以下を変更してください。:
helloworld
ディレクトリの名前を guestbook
に変更しますhelloworld.py
の名前を guestbook.py
に変更しますapp.yaml
のhandlers
項目を以下の内容に置き換えます:handlers: - url: /.* script: guestbook.app
起動コマンドの引数に新しい guestbook
ディレクトリを使用し、デベロップメントサーバを再起動します。
app.yaml
のlibraries
項目に以下を追加し、webapp2
を使用することを宣言します:
libraries: - name: webapp2 version: latest
guestbook/guestbook.py
の内容を以下のように置き換えます:
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
についてのドキュメント を参照してください。