1 from django.conf import settings
2 from django.core.urlresolvers import resolve
3 from django.http import Http404, HttpResponseRedirect
4 from django.views.decorators.vary import vary_on_headers
5 from philo.exceptions import MIDDLEWARE_NOT_CONFIGURED
8 @vary_on_headers('Accept')
9 def node_view(request, path=None, **kwargs):
10 if "philo.middleware.RequestNodeMiddleware" not in settings.MIDDLEWARE_CLASSES:
11 raise MIDDLEWARE_NOT_CONFIGURED
14 if settings.APPEND_SLASH and request.path != "/":
22 view, args, kwargs = resolve(path)
24 return HttpResponseRedirect(path)
28 subpath = request.node.subpath
30 # Explicitly disallow trailing slashes if we are otherwise at a node's url.
31 if request._cached_node_path != "/" and request._cached_node_path[-1] == "/" and subpath == "/":
32 return HttpResponseRedirect(node.get_absolute_url())
34 if not node.handles_subpath(subpath):
35 # If the subpath isn't handled, check settings.APPEND_SLASH. If
36 # it's True, try to correct the subpath.
37 if not settings.APPEND_SLASH:
40 if subpath[-1] == "/":
41 subpath = subpath[:-1]
45 redirect_url = node.construct_url(subpath)
47 if node.handles_subpath(subpath):
48 return HttpResponseRedirect(redirect_url)
50 # Perhaps there is a non-philo view at this address. Can we
51 # resolve *something* there besides node_view? If not,
53 view, args, kwargs = resolve(redirect_url)
58 return HttpResponseRedirect(redirect_url)
60 return node.render_to_response(request, kwargs)