import cgi
import datetime
import logging
import StringIO
import time
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import memcache
from google.appengine.api import images
logging.getLogger().setLevel(logging.DEBUG)
class Greeting(db.Model):
author = db.UserProperty()
content = db.StringProperty(multiline=True)
avatar = db.BlobProperty()
date = db.DateTimeProperty(auto_now_add=True)
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write("
")
before = time.time()
greetings = self.get_greetings()
after = time.time()
timeTaken = str(after - before)
stats = memcache.get_stats()
self.response.out.write("Time to get Greetings:%s seconds
" % timeTaken)
self.response.out.write("Cache Hits:%s
" % stats['hits'])
self.response.out.write("Cache Misses:%s
" %
stats['misses'])
self.response.out.write(greetings)
self.response.out.write("""
""")
def get_greetings(self):
"""
get_greetings()
Checks the cache to see if there are cached greetings.
If not, call render_greetings and set the cache
Returns:
A string of HTML containing greetings.
"""
greetings = memcache.get("greetings")
if greetings is not None:
return greetings
else:
greetings = self.render_greetings()
if not memcache.add("greetings", greetings, 10):
logging.error("Memcache set failed.")
return greetings
def render_greetings(self):
"""
render_greetings()
Queries the database for greetings, iterate through the
results and create the HTML.
Returns:
A string of HTML containing greetings
"""
results = db.GqlQuery("SELECT * "
"FROM Greeting "
"ORDER BY date DESC").fetch(10)
output = StringIO.StringIO()
for result in results:
if result.author:
output.write("%s wrote:" % result.author.nickname())
else:
output.write("An anonymous person wrote:")
output.write("
" %
result.key())
output.write(' %s
' % cgi.escape(result.content))
return output.getvalue()
class Image (webapp.RequestHandler):
def get(self):
greeting = db.get(self.request.get("img_id"))
if greeting.avatar:
self.response.headers['Content-Type'] = "image/png"
self.response.out.write(greeting.avatar)
else:
self.response.out.write("No image")
class Guestbook(webapp.RequestHandler):
def post(self):
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
if self.request.get("img"):
avatar = images.resize(self.request.get("img"), 32, 32)
greeting.avatar = db.Blob(avatar)
greeting.put()
self.redirect('/')
application = webapp.WSGIApplication([
('/', MainPage),
('/img', Image),
('/sign', Guestbook)
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()