第 9 章 アプリケーションのデプロイ 49
14.4 データストアからデータを取得する
44 self.response.write('<input type="text" name="content">')
45 self.response.write('<input type="submit" value="送信" />')
46 self.response.write('</form>')
47 self.response.write('</body></html>')
48
49 def post(self):
50 user = users.get_current_user()
51 if user is None:
52 self.redirect(users.create_login_url(self.request.uri))
53
54 todo = Todo()
55 todo.content = cgi.escape(self.request.get('content'))
56 todo.author = user.nickname()
57 key = todo.put()
58 logging.info("key=%s" % str(key))
59 self.redirect('/')
60 61
62 class MyPageHandler(webapp2.RequestHandler):
63 def get(self):
64 user = users.get_current_user()
65 if user:
66 self.response.headers['Content-Type'] = 'text/plain'
67 self.response.write('Hello, ' + user.nickname())
68 else:
69 self.redirect(users.create_login_url(self.request.uri))
70 71
72 def handle_404(request, response, exception):
73 logging.exception(exception)
74 response.write('ページが見つかりませんでした。')
75 response.set_status(404)
76 77
78 app = webapp2.WSGIApplication([
79 ('/', MainHandler),
80 ('/mypage', MyPageHandler)
81 ], debug=True)
82
83 app.error_handlers[404] = handle_404
14.3.2 確認
入力フォームからデータを追加し、次のことを確認します。
84 第14章 データストアを使う
• DatastoreAdminページを開きデータが追加されている
• Log Consoleに追加されたデータのkeyが出力されている
– 例)key=Key(‘Todo’, 5681726336532480)
14.3.3 解答
解答ドキュメントを参照してください。
44 self.response.write('<input type="text" name="content">')
45 self.response.write('<input type="submit" value="送信" />')
46 self.response.write('</form>')
47 self.response.write('</body></html>')
48
49 def post(self):
50 user = users.get_current_user()
51 if user is None:
52 self.redirect(users.create_login_url(self.request.uri))
53
54 todo = Todo()
55 todo.content = cgi.escape(self.request.get('content'))
56 todo.author = user.nickname()
57 key = todo.put()
58 logging.info("key=%s" % str(key))
59 self.redirect('/')
60 61
62 class MyPageHandler(webapp2.RequestHandler):
63 def get(self):
64 user = users.get_current_user()
65 if user:
66 self.response.headers['Content-Type'] = 'text/plain'
67 self.response.write('Hello, ' + user.nickname())
68 else:
69 self.redirect(users.create_login_url(self.request.uri))
70 71
72 def handle_404(request, response, exception):
73 logging.exception(exception)
74 response.write('ページが見つかりませんでした。')
75 response.set_status(404)
76 77
78 app = webapp2.WSGIApplication([
79 ('/', MainHandler),
80 ('/mypage', MyPageHandler)
81 ], debug=True)
82
83 app.error_handlers[404] = handle_404
14.3.2 確認
入力フォームからデータを追加し、次のことを確認します。
84 第14章 データストアを使う
• DatastoreAdminページを開きデータが追加されている
• Log Consoleに追加されたデータのkeyが出力されている
– 例)key=Key(‘Todo’, 5681726336532480)
14.3.3 解答
解答ドキュメントを参照してください。
14.4 データストアからデータを取得する
次は保存されたデータを取得する方法について説明します。
14.4.1 データの取得方法
以下のコードは、入力フォームにデータストアに保存された全てのToDoデータを一覧表示しています・
1 class MainHandler(webapp2.RequestHandler):
2 def get(self):
3 user = users.get_current_user()
4 if user is None:
5 self.redirect(users.create_login_url(self.request.uri))
6 return
7
8 self.response.write('<html><body>')
9 self.response.write('<h1>TODOリスト</h1>')
10 self.response.write('<form method="post" action="/">')
11 self.response.write('<input type="text" name="content">')
12 self.response.write('<input type="submit" value="送信" />')
13 self.response.write('</form>')
14 self.response.write('<ul>')
15
16 todos = Todo.query(Todo.author==user.nickname())
17 for todo in todos:
18 self.response.out.write('<li>%s</li>' %
19 cgi.escape(todo.content))
20 self.response.write('</ul>')
21 self.response.write('</body></html>')
データストアから、ログインユーザのToDoを全件取得します。
14.4. データストアからデータを取得する 85
Todo.query(Todo.author==user.nickname())メソッドを使って、データを取得します。引数に、条 件式を指定します。ここでは、authorプロパティがログインユーザと一致しているものを指定します。
queryメソッドを実行すると、データストアからデータを取得するための、Queryオブジェクトが返ってきます。
Queryオブエジェクトについては、あまり難しく考えずに、登録されたToDoデータがまとまったものと考えてく
ださい。厳密には違いますが、まずはそのくらいの間隔で覚えたほうが理解しやすいでしょう。
Queryオブジェクトのの詳しい説明は、公式サイトを参照してください。(
https://cloud.google.com/appengine/docs/python/ndb/queries)
次に、self.response.out.write(’<li>%s</li>’ % cgi.escape(todo.content))で、Query オブジェクトからToDoを1件ずつ取得し、html文の組み立てを行っています。
1 todos = Todo.query(Todo.author==user.nickname())
2 for todo in todos:
3 self.response.out.write('<li>%s</li>' %
4 cgi.escape(todo.content))
main.py
main.pyは次のような内容になります。
1 # coding: utf-8
-*-2 #!/usr/bin/env python
3 #
4 # Copyright 2007 Google Inc.
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 from google.appengine.api import users
19 from google.appengine.ext import ndb
20 import cgi
21 import os
22 import jinja2
23 import webapp2
86 第14章 データストアを使う
24 import logging
25
26 JINJA_ENVIRONMENT = jinja2.Environment(
27 loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
28 extensions=['jinja2.ext.autoescape'],
29 autoescape=True)
30 31
32 class Todo(ndb.Model):
33 """Models an individual Todo entry with author, content, and date."""
34 author = ndb.StringProperty()
35 content = ndb.StringProperty(indexed=False)
36 date = ndb.DateTimeProperty(auto_now_add=True)
37 38
39 class MainHandler(webapp2.RequestHandler):
40 def get(self):
41 user = users.get_current_user()
42 if user is None:
43 self.redirect(users.create_login_url(self.request.uri))
44 return
45
46 self.response.write('<html><body>')
47 self.response.write('<h1>TODOリスト</h1>')
48 self.response.write('<form method="post" action="/">')
49 self.response.write('<input type="text" name="content">')
50 self.response.write('<input type="submit" value="送信" />')
51 self.response.write('</form>')
52 self.response.write('<ul>')
53
54 todos = Todo.query(Todo.author==user.nickname())
55 for todo in todos:
56 self.response.out.write('<li>%s</li>' %
57 cgi.escape(todo.content))
58 self.response.write('</ul>')
59 self.response.write('</body></html>')
60
61 def post(self):
62 user = users.get_current_user()
63 if user is None:
64 self.redirect(users.create_login_url(self.request.uri))
65 return
66
67 todo = Todo()
68 todo.content = cgi.escape(self.request.get('content'))
69 todo.author = user.nickname()
70 key = todo.put()
14.4. データストアからデータを取得する 87
Todo.query(Todo.author==user.nickname())メソッドを使って、データを取得します。引数に、条 件式を指定します。ここでは、authorプロパティがログインユーザと一致しているものを指定します。
queryメソッドを実行すると、データストアからデータを取得するための、Queryオブジェクトが返ってきます。
Queryオブエジェクトについては、あまり難しく考えずに、登録されたToDoデータがまとまったものと考えてく
ださい。厳密には違いますが、まずはそのくらいの間隔で覚えたほうが理解しやすいでしょう。
Queryオブジェクトのの詳しい説明は、公式サイトを参照してください。(
https://cloud.google.com/appengine/docs/python/ndb/queries)
次に、self.response.out.write(’<li>%s</li>’ % cgi.escape(todo.content))で、Query オブジェクトからToDoを1件ずつ取得し、html文の組み立てを行っています。
1 todos = Todo.query(Todo.author==user.nickname())
2 for todo in todos:
3 self.response.out.write('<li>%s</li>' %
4 cgi.escape(todo.content))
main.py
main.pyは次のような内容になります。
1 # coding: utf-8
-*-2 #!/usr/bin/env python
3 #
4 # Copyright 2007 Google Inc.
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 from google.appengine.api import users
19 from google.appengine.ext import ndb
20 import cgi
21 import os
22 import jinja2
23 import webapp2
86 第14章 データストアを使う
24 import logging
25
26 JINJA_ENVIRONMENT = jinja2.Environment(
27 loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
28 extensions=['jinja2.ext.autoescape'],
29 autoescape=True)
30 31
32 class Todo(ndb.Model):
33 """Models an individual Todo entry with author, content, and date."""
34 author = ndb.StringProperty()
35 content = ndb.StringProperty(indexed=False)
36 date = ndb.DateTimeProperty(auto_now_add=True)
37 38
39 class MainHandler(webapp2.RequestHandler):
40 def get(self):
41 user = users.get_current_user()
42 if user is None:
43 self.redirect(users.create_login_url(self.request.uri))
44 return
45
46 self.response.write('<html><body>')
47 self.response.write('<h1>TODOリスト</h1>')
48 self.response.write('<form method="post" action="/">')
49 self.response.write('<input type="text" name="content">')
50 self.response.write('<input type="submit" value="送信" />')
51 self.response.write('</form>')
52 self.response.write('<ul>')
53
54 todos = Todo.query(Todo.author==user.nickname())
55 for todo in todos:
56 self.response.out.write('<li>%s</li>' %
57 cgi.escape(todo.content))
58 self.response.write('</ul>')
59 self.response.write('</body></html>')
60
61 def post(self):
62 user = users.get_current_user()
63 if user is None:
64 self.redirect(users.create_login_url(self.request.uri))
65 return
66
67 todo = Todo()
68 todo.content = cgi.escape(self.request.get('content'))
69 todo.author = user.nickname()
70 key = todo.put()
14.4. データストアからデータを取得する 87
71 logging.info("key=%s" % str(key))
72 self.redirect('/')
73 74
75 class MyPageHandler(webapp2.RequestHandler):
76 def get(self):
77 user = users.get_current_user()
78 if user:
79 self.response.headers['Content-Type'] = 'text/plain'
80 self.response.write('Hello, ' + user.nickname())
81 else:
82 self.redirect(users.create_login_url(self.request.uri))
83 return
84 85
86 def handle_404(request, response, exception):
87 logging.exception(exception)
88 response.write('ページが見つかりませんでした。')
89 response.set_status(404)
90 91
92 app = webapp2.WSGIApplication([
93 ('/', MainHandler),
94 ('/mypage', MyPageHandler)
95 ], debug=True)
96
97 app.error_handlers[404] = handle_404
確認
入力フォーム画面で、ToDo一覧が表示されていることを確認します。
88 第14章 データストアを使う