appengine/standard/images/guestbook/main.py (63 lines of code) (raw):

# Copyright 2015 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Sample application that demonstrates how to use the App Engine Images API. For more information, see README.md. """ # [START gae_images_guestbook_all] import cgi import urllib # [START gae_images_guestbook_import_images] from google.appengine.api import images # [END gae_images_guestbook_import_images] from google.appengine.api import users from google.appengine.ext import ndb import webapp2 # [START gae_images_guestbook_model] class Greeting(ndb.Model): """Models a Guestbook entry with an author, content, avatar, and date.""" author = ndb.StringProperty() content = ndb.TextProperty() avatar = ndb.BlobProperty() date = ndb.DateTimeProperty(auto_now_add=True) # [END gae_images_guestbook_model] 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 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) ) for greeting in greetings: if greeting.author: self.response.out.write("<b>%s</b> wrote:" % greeting.author) else: self.response.out.write("An anonymous person wrote:") # [START gae_images_guestbook_display_image] self.response.out.write( '<div><img src="/img?img_id=%s"></img>' % greeting.key.urlsafe() ) self.response.out.write( "<blockquote>%s</blockquote></div>" % cgi.escape(greeting.content) ) # [END gae_images_guestbook_display_image] # [START gae_images_guestbook_form] self.response.out.write( """ <form action="/sign?%s" enctype="multipart/form-data" method="post"> <div> <textarea name="content" rows="3" cols="60"></textarea> </div> <div><label>Avatar:</label></div> <div><input type="file" name="img"/></div> <div><input type="submit" value="Sign Guestbook"></div> </form> <hr> <form>Guestbook name: <input value="%s" name="guestbook_name"> <input type="submit" value="switch"></form> </body> </html>""" % ( urllib.urlencode({"guestbook_name": guestbook_name}), cgi.escape(guestbook_name), ) ) # [END gae_images_guestbook_form] # [START gae_images_guestbook_image_handler] class Image(webapp2.RequestHandler): def get(self): greeting_key = ndb.Key(urlsafe=self.request.get("img_id")) greeting = greeting_key.get() if greeting.avatar: self.response.headers["Content-Type"] = "image/png" self.response.out.write(greeting.avatar) else: self.response.out.write("No image") # [END gae_images_guestbook_image_handler] # [START gae_images_guestbook_sign_handler] class Guestbook(webapp2.RequestHandler): def post(self): guestbook_name = self.request.get("guestbook_name") greeting = Greeting(parent=guestbook_key(guestbook_name)) if users.get_current_user(): greeting.author = users.get_current_user().nickname() greeting.content = self.request.get("content") avatar = self.request.get("img") # [START gae_images_guestbook_transform] avatar = images.resize(avatar, 32, 32) # [END gae_images_guestbook_transform] greeting.avatar = avatar greeting.put() self.redirect("/?" + urllib.urlencode({"guestbook_name": guestbook_name})) # [END gae_images_guestbook_sign_handler] app = webapp2.WSGIApplication( [("/", MainPage), ("/img", Image), ("/sign", Guestbook)], debug=True ) # [END gae_images_guestbook_all]