ユーザーがあいさつ文を投稿できるようにしたい場合は、ユーザーによってウェブフォームから送信された情報を処理するロジックが必要です。
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についてのドキュメント を参照してください。