diff options
author | Christopher Allan Webber <cwebber@dustycloud.org> | 2010-07-17 11:33:08 -0500 |
---|---|---|
committer | Christopher Allan Webber <cwebber@dustycloud.org> | 2010-07-17 11:33:08 -0500 |
commit | 31a8ff428869614db3cae06ab24dbdb1e3d98064 (patch) | |
tree | e050f3efeff5591ca0ab42fa70ed77443560b7ed /mediagoblin | |
download | mediagoblin-31a8ff428869614db3cae06ab24dbdb1e3d98064.tar.lz mediagoblin-31a8ff428869614db3cae06ab24dbdb1e3d98064.tar.xz mediagoblin-31a8ff428869614db3cae06ab24dbdb1e3d98064.zip |
Initial mediagoblin structure
Diffstat (limited to 'mediagoblin')
-rw-r--r-- | mediagoblin/__init__.py | 0 | ||||
-rw-r--r-- | mediagoblin/app.py | 64 | ||||
-rw-r--r-- | mediagoblin/routing.py | 7 | ||||
-rw-r--r-- | mediagoblin/util.py | 11 | ||||
-rw-r--r-- | mediagoblin/views.py | 4 |
5 files changed, 86 insertions, 0 deletions
diff --git a/mediagoblin/__init__.py b/mediagoblin/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/mediagoblin/__init__.py diff --git a/mediagoblin/app.py b/mediagoblin/app.py new file mode 100644 index 00000000..41ab7f20 --- /dev/null +++ b/mediagoblin/app.py @@ -0,0 +1,64 @@ +import sys +import urllib + +from webob import Request, exc +import routes + +from mediagoblin import routing, util + + +class Error(Exception): pass +class ImproperlyConfigured(Error): pass + + +def load_controller(string): + module_name, func_name = string.split(':', 1) + __import__(module_name) + module = sys.modules[module_name] + func = getattr(module, func_name) + return func + + +class MediagoblinApp(object): + """ + Really basic wsgi app using routes and WebOb. + """ + def __init__(self, user_template_path=None): + self.template_env = util.get_jinja_env(user_template_path) + + def __call__(self, environ, start_response): + request = Request(environ) + path_info = request.path_info + route_match = routing.mapping.match(path_info) + + # No matching page? + if route_match is None: + # Try to do see if we have a match with a trailing slash + # added and if so, redirect + if not path_info.endswith('/') \ + and request.method == 'GET' \ + and routing.mapping.match(path_info + '/'): + new_path_info = path_info + '/' + if request.GET: + new_path_info = '%s?%s' % ( + new_path_info, urllib.urlencode(request.GET)) + redirect = exc.HTTPTemporaryRedirect(location=new_path_info) + return request.get_response(redirect)(environ, start_response) + + # Okay, no matches. 404 time! + return exc.HTTPNotFound()(environ, start_response) + + controller = load_controller(route_match['controller']) + request.start_response = start_response + + request.matchdict = route_match + request.app = self + request.template_env = self.template_env + request.urlgen = routes.URLGenerator(routing.mapping, environ) + + return controller(request)(environ, start_response) + + +def paste_app_factory(global_config, **kw): + return MediagoblinApp( + user_template_path=kw.get('local_templates')) diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py new file mode 100644 index 00000000..fec08370 --- /dev/null +++ b/mediagoblin/routing.py @@ -0,0 +1,7 @@ +from routes import Mapper + +mapping = Mapper() +mapping.minimization = False + +mapping.connect( + "index", "/", controller="mediagoblin.views:root_view") diff --git a/mediagoblin/util.py b/mediagoblin/util.py new file mode 100644 index 00000000..2af9b380 --- /dev/null +++ b/mediagoblin/util.py @@ -0,0 +1,11 @@ +import jinja2 + +def get_jinja_env(user_template_path=None): + if user_template_path: + loader = jinja2.ChoiceLoader( + [jinja2.FileSystemLoader(user_template_path), + jinja2.PackageLoader('mediagoblin', 'templates')]) + else: + loader = jinja2.PackageLoader('mediagoblin', 'templates') + + return jinja2.Environment(loader=loader, autoescape=True) diff --git a/mediagoblin/views.py b/mediagoblin/views.py new file mode 100644 index 00000000..1b109453 --- /dev/null +++ b/mediagoblin/views.py @@ -0,0 +1,4 @@ +from webob import Response, exc + +def root_view(request): + return Response("This is the root") |