• 検索結果がありません。

データストアからデータを取得する

第 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 確認

入力フォームからデータを追加し、次のことを確認します。

8414章 データストアを使う

• 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 確認

入力フォームからデータを追加し、次のことを確認します。

8414章 データストアを使う

• 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

8614章 データストアを使う

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

8614章 データストアを使う

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一覧が表示されていることを確認します。

8814章 データストアを使う