aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/tools/routing.py
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin/tools/routing.py')
-rw-r--r--mediagoblin/tools/routing.py28
1 files changed, 25 insertions, 3 deletions
diff --git a/mediagoblin/tools/routing.py b/mediagoblin/tools/routing.py
index a15795fe..ae7c7154 100644
--- a/mediagoblin/tools/routing.py
+++ b/mediagoblin/tools/routing.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
+import urlparse
import six
from werkzeug.routing import Map, Rule
@@ -27,15 +28,22 @@ url_map = Map()
class MGRoute(Rule):
- def __init__(self, endpoint, url, controller):
+ def __init__(self, endpoint, url, controller, match_slash=True):
Rule.__init__(self, url, endpoint=endpoint)
self.gmg_controller = controller
+ self.match_slash = match_slash
def empty(self):
new_rule = Rule.empty(self)
new_rule.gmg_controller = self.gmg_controller
return new_rule
+ def match(self, path, *args, **kwargs):
+ if not (self.match_slash or path.endswith("/")):
+ path = path + "/"
+
+ return super(MGRoute, self).match(path, *args, **kwargs)
+
def endpoint_to_controller(rule):
endpoint = rule.endpoint
@@ -51,11 +59,11 @@ def endpoint_to_controller(rule):
return view_func
-def add_route(endpoint, url, controller):
+def add_route(endpoint, url, controller, *args, **kwargs):
"""
Add a route to the url mapping
"""
- url_map.add(MGRoute(endpoint, url, controller))
+ url_map.add(MGRoute(endpoint, url, controller, *args, **kwargs))
def mount(mountpoint, routes):
@@ -65,3 +73,17 @@ def mount(mountpoint, routes):
for endpoint, url, controller in routes:
url = "%s/%s" % (mountpoint.rstrip('/'), url.lstrip('/'))
add_route(endpoint, url, controller)
+
+def extract_url_arguments(url, urlmap):
+ """
+ This extracts the URL arguments from a given URL
+ """
+ parsed_url = urlparse.urlparse(url)
+ map_adapter = urlmap.bind(
+ server_name=parsed_url.netloc,
+ script_name=parsed_url.path,
+ url_scheme=parsed_url.scheme,
+ path_info=parsed_url.path
+ )
+
+ return map_adapter.match()[1]