summaryrefslogtreecommitdiffstats
path: root/google_appengine/google/appengine/ext/webapp/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'google_appengine/google/appengine/ext/webapp/util.py')
-rwxr-xr-xgoogle_appengine/google/appengine/ext/webapp/util.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/google_appengine/google/appengine/ext/webapp/util.py b/google_appengine/google/appengine/ext/webapp/util.py
new file mode 100755
index 0000000..80adf75
--- /dev/null
+++ b/google_appengine/google/appengine/ext/webapp/util.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 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.
+#
+
+"""Convience functions for the Webapp framework."""
+
+
+
+
+
+__all__ = ["login_required", "run_wsgi_app"]
+
+import os
+import sys
+import wsgiref.util
+
+from google.appengine.api import users
+from google.appengine.ext import webapp
+
+
+def login_required(handler_method):
+ """A decorator to require that a user be logged in to access a handler.
+
+ To use it, decorate your get() method like this:
+
+ @login_required
+ def get(self):
+ user = users.get_current_user(self)
+ self.response.out.write('Hello, ' + user.nickname())
+
+ We will redirect to a login page if the user is not logged in. We always
+ redirect to the request URI, and Google Accounts only redirects back as a GET
+ request, so this should not be used for POSTs.
+ """
+ def check_login(self, *args):
+ if self.request.method != 'GET':
+ raise webapp.Error('The check_login decorator can only be used for GET '
+ 'requests')
+ user = users.get_current_user()
+ if not user:
+ self.redirect(users.create_login_url(self.request.uri))
+ return
+ else:
+ handler_method(self, *args)
+ return check_login
+
+
+def run_wsgi_app(application):
+ """Runs your WSGI-compliant application object in a CGI environment.
+
+ Compared to wsgiref.handlers.CGIHandler().run(application), this
+ function takes some shortcuts. Those are possible because the
+ app server makes stronger promises than the CGI standard.
+ """
+ env = dict(os.environ)
+ env["wsgi.input"] = sys.stdin
+ env["wsgi.errors"] = sys.stderr
+ env["wsgi.version"] = (1, 0)
+ env["wsgi.run_once"] = True
+ env["wsgi.url_scheme"] = wsgiref.util.guess_scheme(env)
+ env["wsgi.multithread"] = False
+ env["wsgi.multiprocess"] = False
+ result = application(env, _start_response)
+ if result is not None:
+ for data in result:
+ sys.stdout.write(data)
+
+
+def _start_response(status, headers, exc_info=None):
+ """A start_response() callable as specified by PEP 333"""
+ if exc_info is not None:
+ raise exc_info[0], exc_info[1], exc_info[2]
+ print "Status: %s" % status
+ for name, val in headers:
+ print "%s: %s" % (name, val)
+ print
+ return sys.stdout.write