1

Ben Google App Engine tutorial takip ediyorum Google App Engine webapp2 defteri eğitimde iki farklı görüntüyü gösterebilir nasıl yapılır (burada onların complete demo code on GitHub) ve istiyorum:bir 'permalink' detay sayfası

  1. bir ziyaretçi defteri kullanıcı izin ver numaralı telefona, bir selamlama gönderirken 'avatar' ek olarak ek bir resim yükleyin. Bu bir tebrik gönderdikten sonra 'diğer'
  2. denilebilir, /tebrik/sayısal-id yerine tüm selamını listeleyen ana sayfa gibi bir URL'ye sahip tebrik detay sayfaya yönlendirir. görüntülerin

Ben Anlamakta zorlandığım detail.html adında bir jinja2 şablonu kullanarak ile

  • Ekranayrıntı sayfası: yönlendirme kodunu yazmak için

    A) Bir kez bir tebrik yayınlandı denir böylece /tebrik/sayısal-kimlik gibi bir URL'ye yönlendirir. Detay görünümü ve şablon sayfası nasıl yazılır

    B) Kullanıcı yönlendirildiğinde o ve görüntüleri gösterilir böylece tebrik kimliği için.

    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) 
    

    Benim detail.html şablonu::

    <!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 %} 
    

    enter image description here

    İşte guestbook.py var: Burada

    bir diyagram ben ne yapmak istediğinizi gösteriyoro yararlıdır durumunda

    Benim 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 
    

    Hata:

    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' 
    

    Herhangi bir yardım veya daha da iyisi, örnek kod, çok takdir edilecektir. Bir GAE/webapp2 blog öğreticisi, örnek kod detayı ve liste görünümleri ve şablonlar ile harika olurdu, ancak belki de GAE BlobStore'un veri yapısı bir blog için uygun değil midir?

    Güncelleme: Ben 500 hatası yerine yığın izleme almak ve ben şablon kontrolleri çalışırsanız ben boş tebrik sayfası almak Dan'in yanıtında katkıda piton onay kodunu eklerseniz. Soruyu tam kodumla ve ne yapmaya çalıştığımı açıklayan bir diyagramla güncelledim.

  • +1

    Sorun nedir? herhangi bir hata aldın mı? kod çalışmıyor? – marcadian

    +0

    - "File" /Users/simon/Projects/guestbook/detail.html ", satır 11, üst düzey şablon kodunda UndefinedError ekledim: 'Hiçbiri' hiçbir özelliğe sahip değil 'anahtar' ' – sgriffee

    cevap