前回のコード (Google App Engine でシンプルな画面遷移) は、コントローラ (webapp.RequestHandler のサブクラス) が、画面に表示する内容も生成していた。これを、 Django を利用してコントローラからビューを分離する。
Google App Engine には、Django が含まれている。
For your convenience, the
webapp
module includes Django's templating engine. This is included with the SDK and is part of App Engine, so you do not need to bundle it to use it.
同上を参考にして、前回のコードを変更した。
概略
前回 Apage, Bpage クラスで生成していた HTML を、それぞれ A.html, B.html に移動させた。フォームで投げられたリクエストの内容は、 BPage クラスで取り出し、遷移先である B.html と共に、template に渡す。
コード
まず、コントローラである APage, BPage を含むファイル。 (gamenseni.py)
import cgi import wsgiref.handlers from google.appengine.ext import webapp import os from google.appengine.ext.webapp import template # 遷移元を表示するコントローラ class APage(webapp.RequestHandler): def get(self): # テンプレートで表示する変数 template_values ={} # テンプレートファイルへのパス path = os.path.join(os.path.dirname(__file__), 'A.html') # template に表示を生成してもらったものを出力 self.response.out.write(template.render(path, template_values)) # 遷移先を表示するコントローラ class BPage(webapp.RequestHandler): def get(self): # フォームから送信された内容を取得する template_values ={ 'name': self.request.get('name') } path = os.path.join(os.path.dirname(__file__), 'B.html') self.response.out.write(template.render(path, template_values)) def main(): # 画面遷移の対応付け application = webapp.WSGIApplication( [('/', APage), ('/seni', BPage)], debug=True) wsgiref.handlers.CGIHandler().run(application) if __name__ == "__main__": main()
遷移元である、フォームを含む A.html 。
<html> <head> <title>A</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <h1>遷移前</h1> <form action="/seni"> お名前: <input type="text" name="name"/> <input type="submit" value="送信" /> </form> </body> </html>
遷移先である B.html 。
<html> <head> <title>B</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <h1>遷移後</h1> <p>お名前: {{ name|escape }}</p> </body> </html>
{{ 変数 }}
で、BPage クラスで template に渡された値を表示することができる。
|escape
は、 フォームから送信された内容を表示するときに、 HTML エスケープしている。Django ではフィルタと呼ばれる機能。 Django | The Django template language: For template authors | Django Documentation によると、
escape
Escapes a string’s HTML. Specifically, it makes these replacements:
- "&" to "&"
- < to "<"
- > to ">"
- '"' (double quote) to '"'
- "'" (single quote) to '''
app.yaml は前回と同じ。
application: gamenseni version: 1 runtime: python api_version: 1 handlers: - url: /.* script: gamenseni.py
0コメント:
コメントを投稿