remove use of 1.6.4-compatible 'wrapper'
[gae-samples.git] / guestbook / guestbook9_profiling.py
blobbdbf8ea2689a89f96f92bc46d4faca756a631906
1 import cgi
2 import os
3 import pickle
4 import logging
5 import cProfile, pstats
7 from google.appengine.api import users
8 from google.appengine.ext import webapp
9 from google.appengine.ext.webapp.util import run_wsgi_app
10 from google.appengine.ext import db
11 from google.appengine.ext.webapp import template
12 from google.appengine.api import memcache
14 MEMCACHE_GREETINGS = 'greetings'
16 class Greeting(db.Model):
17 author = db.UserProperty()
18 content = db.StringProperty(multiline=True)
19 date = db.DateTimeProperty(auto_now_add=True)
21 class MainPage(webapp.RequestHandler):
22 def get(self):
23 logging.debug("In MainPage handler");
24 greetingsString = memcache.get(MEMCACHE_GREETINGS)
25 if greetingsString is not None:
26 logging.info("Retrieved greetings from memcache")
27 greetings = pickle.loads(greetingsString)
28 else:
29 logging.info("No greetings in memcache, re-querying datastore")
30 greetings_query = Greeting.all().order('-date')
31 greetings = greetings_query.fetch(10)
32 if not memcache.set(MEMCACHE_GREETINGS, pickle.dumps(greetings)):
33 logging.error("Memcache set failed.")
35 if users.get_current_user():
36 url = users.create_logout_url(self.request.uri)
37 url_linktext = 'Logout'
38 else:
39 url = users.create_login_url(self.request.uri)
40 url_linktext = 'Login'
42 template_values = {
43 'greetings': greetings,
44 'url': url,
45 'url_linktext': url_linktext,
48 path = os.path.join(os.path.dirname(__file__), 'index.html')
49 self.response.out.write(template.render(path, template_values))
52 class Guestbook(webapp.RequestHandler):
53 def post(self):
54 greeting = Greeting()
56 if users.get_current_user():
57 greeting.author = users.get_current_user()
59 greeting.content = self.request.get('content')
60 greeting.put()
61 memcache.delete(MEMCACHE_GREETINGS)
62 self.redirect('/')
64 application = webapp.WSGIApplication(
65 [('/', MainPage),
66 ('/sign', Guestbook)],
67 debug=True)
69 def real_main():
70 run_wsgi_app(application)
72 def profile_main():
73 # This is the main function for profiling
74 # We've renamed our original main() above to real_main()
75 prof = cProfile.Profile()
76 prof = prof.runctx("real_main()", globals(), locals())
77 print "<pre>"
78 stats = pstats.Stats(prof)
79 stats.sort_stats("time") # Or cumulative
80 stats.print_stats(80) # 80 = how many to print
81 # The rest is optional.
82 # stats.print_callees()
83 # stats.print_callers()
84 print "</pre>"
86 def main():
87 profile_main()
89 if __name__ == "__main__":
90 main()