1

私はGoogle App Engine tutorial次てるGoogle App Engineのwebapp2をゲストブックのチュートリアルの2枚の画像を表示するようにする方法(ここにある彼らのcomplete demo code on GitHub)をしてしたいと思います:「パーマリンク」詳細ページは

  1. ゲストブックのユーザーを許可挨拶を投稿するときに「アバター」に加えてをアップロードしてにアップロードしてください。これは、ではなく、すべての挨拶を一覧メインページの/挨拶/数値IDのようなURLでの挨拶の詳細ページへユーザーをリダイレクトし、挨拶を掲載した後「
  2. と呼ばれることがあります。 画像

私はトラブル理解抱えているdetail.html呼ばJinja2のテンプレートを使用したと

  • 表示詳細ページ:リダイレクトコードを書くための方法

    A)をグリーティングが公開されると呼び出され、/greeting/numeric-idのようなURLにリダイレクトされます。詳細ビューとテンプレートページを書く方法

    B)は、ユーザーがリダイレクトされていることを画像がを表示しているので、グリーティングIDへ​​。ここで

    は、私が何をしたいのかを示す図です:

    enter image description here

    ここguestbook.pyです:

    import os 
    import urllib 
    from google.appengine.api import images 
    from google.appengine.api import users 
    from google.appengine.ext import ndb 
    from google.appengine.ext.webapp import blobstore_handlers 
    from google.appengine.ext import blobstore 
    import jinja2 
    import webapp2 
    
    JINJA_ENVIRONMENT = jinja2.Environment(
        loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), 
        extensions=['jinja2.ext.autoescape'], 
        autoescape=True) 
    
    DEFAULT_GUESTBOOK_NAME = 'default_guestbook' 
    
    def guestbook_key(guestbook_name=None): 
        """Constructs a Datastore key for a Guestbook entity with name.""" 
        return ndb.Key('Guestbook', guestbook_name or 'default_guestbook') 
    
    class Author(ndb.Model): 
        """Sub model for representing an author.""" 
        identity = ndb.StringProperty(indexed=False) 
        email = ndb.StringProperty(indexed=False) 
    
    class Greeting(ndb.Model): 
        """A model for representing an individual Greeting entry.""" 
        author = ndb.StructuredProperty(Author) 
        date = ndb.DateTimeProperty(auto_now_add=True) 
        avatar = ndb.BlobProperty(indexed=False, required=True) 
        other = ndb.BlobProperty(indexed=False, required=True) 
    
    class MainPage(webapp2.RequestHandler): 
        def get(self): 
         self.response.out.write('<html><body>') 
         guestbook_name = self.request.get('guestbook_name') 
    
         greetings = Greeting.query(
          ancestor=guestbook_key(guestbook_name)) \ 
          .order(-Greeting.date) \ 
          .fetch(10) 
    
         self.response.out.write(""" 
           <form action="/sign?%s" 
            enctype="multipart/form-data" 
            method="post"> 
           <label>Avatar:</label> 
           <input type="file" name="avatar"/><br> 
           <label>Other Image:</label> 
           <input type="file" name="other"/><br> 
           <input type="submit" value="Submit"> 
           </form> 
          </body> 
          </html>""" % (urllib.urlencode({'guestbook_name': guestbook_name}))) 
    
    class Image(webapp2.RequestHandler): 
        """ Handle image stored as blobs of bytes. 
         No idea how the template knows to select a particular one. """ 
        def get(self): 
         avatar_greeting_key = ndb.Key(urlsafe=self.request.get('avatar_id')) 
         other_greeting_key = ndb.Key(urlsafe=self.request.get('other_id')) 
         avatar_greeting = avatar_greeting_key.get() 
         other_greeting = other_greeting_key.get() 
         if avatar_greeting.avatar: 
          self.response.headers['Content-Type'] = 'image/png' 
          self.response.out.write(avatar_greeting.avatar) 
         elif other_greeting.other: 
          self.response.headers['Content-Type'] = 'image/png' 
          self.response.out.write(other_greeting.other) 
         else: 
          self.response.out.write('No image') 
    
    class Guestbook(webapp2.RequestHandler): 
        def post(self): 
         guestbook_name = self.request.get('guestbook_name', 
                  DEFAULT_GUESTBOOK_NAME) 
         greeting = Greeting(parent=guestbook_key(guestbook_name)) 
    
         if users.get_current_user(): 
          greeting.author = Author(
            identity=users.get_current_user().user_id(), 
            email=users.get_current_user().email()) 
    
         avatar = self.request.get('avatar') 
         avatar = images.resize(avatar, 100, 100) 
         other = self.request.get('other') 
         other = images.resize(other, 400, 300) 
    
         greeting.avatar = avatar 
         greeting.other = other 
    
         greeting.put() 
    
         query_params = {'guestbook_name': guestbook_name} 
         self.redirect('/greeting/%d' % greeting.key.id()) 
    
    class Detail(webapp2.RequestHandler): 
        """ Individual greeting. """ 
        def get(self, *args, **kwargs): 
         guestbook_name = self.request.get('guestbook_name', DEFAULT_GUESTBOOK_NAME) 
    
         greeting = Greeting.get_by_id(args[0], 
                  parent=guestbook_key(guestbook_name)) 
    
         template_values = { 
          'greeting': greeting, 
         } 
    
         template = JINJA_ENVIRONMENT.get_template('detail.html') 
         self.response.write(template.render(template_values)) 
    
    
    app = webapp2.WSGIApplication([ 
        ('/', MainPage), 
        ('/img', Image), 
        ('/sign', Guestbook), 
        ('/greeting/(\d+)', Detail), 
        ], debug=True) 
    

    マイdetail.htmlテンプレート:

    <!DOCTYPE html> 
    {% autoescape true %} 
    <html> 
        <head> 
        <title>Greeting {{ greeting.id }}</title> 
        </head> 
        <body> 
        <h2>Greeting {{ greeting.id }}</h2> 
         Avatar: <img src="/img?avatar_id={{ greeting.key.urlsafe() }}"> 
         <br> 
         Other: <img src="/img?other_id={{ greeting.key.urlsafe() }}"> 
        </body> 
    </html> 
    {% endautoescape %} 
    
    は、それが有用である場合には3210

    マイapp.yamlを

    runtime: python27 
    api_version: 1 
    threadsafe: true 
    
    # Handlers match in order, put above the default handler. 
    handlers: 
    - url: /stylesheets 
        static_dir: stylesheets 
    
    - url: /.* 
        script: guestbook.app 
    
    libraries: 
    - name: webapp2 
        version: latest 
    - name: jinja2 
        version: latest 
    

    エラー:

    Traceback (most recent call last): 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__ 
        rv = self.handle_exception(request, response, e) 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__ 
        rv = self.router.dispatch(request, response) 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher 
        return route.handler_adapter(request, response) 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__ 
        return handler.dispatch() 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch 
        return self.handle_exception(e, self.app.debug) 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch 
        return method(*args, **kwargs) 
        File "/Users/simon/Projects/guestbook/guestbook.py", line 111, in get 
        self.response.write(template.render(template_values)) 
        File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/jinja2-2.6/jinja2/environment.py", line 894, in render 
        return self.environment.handle_exception(exc_info, True) 
        File "/Users/simon/Projects/guestbook/detail.html", line 9, in top-level template code 
        Avatar: <img src="/img?avatar_id={{ greeting.key.urlsafe() }}"> 
    UndefinedError: 'None' has no attribute 'key' 
    

    すべてのヘルプ、またはより良い、サンプルコードは、はるかに高く評価されるだろう。 GAE/webapp2のブログチュートリアルでは、ディテールやリストのビューとテンプレートのサンプルコードは素晴らしいですが、おそらくGAE BlobStoreのデータ構造はブログには理想的ではありませんか?

    更新: 私はダンの答えに貢献したのpythonチェックコードを追加した場合、私が代わりにスタックトレースの500エラーを取得し、私はテンプレートのチェックをしようとした場合、私は空白のグリーティングページを取得します。私はフルコードと私が何をしようとしているのかを説明するダイアグラムで質問を更新しました。

  • +1

    問題点を教えてください。何かエラーがありましたか?コードは機能しませんか? – marcadian

    +0

    エラー - 'File" /Users/simon/Projects/guestbook/detail.html "行11をトップレベルのテンプレートコード に追加しましたUndefinedError: 'None'には属性 'key'がありません – sgriffee

    答えて