From 54825f2f7439be55e0e94c4328a178d50416e09a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Elsd=C3=B6rfer?= Date: Tue, 14 Apr 2015 18:55:28 +0200 Subject: [PATCH] Support relative flask endpoints. --- flask_s3.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/flask_s3.py b/flask_s3.py index b83fffe..4256f3f 100644 --- a/flask_s3.py +++ b/flask_s3.py @@ -6,6 +6,7 @@ from flask import url_for as flask_url_for from flask import current_app +from flask import _request_ctx_stack, request from boto.s3.connection import S3Connection from boto.s3 import connect_to_region from boto.exception import S3CreateError, S3ResponseError @@ -28,6 +29,33 @@ def hash_file(filename): return hasher.hexdigest() +def support_relative_endpoints(endpoint): + """Copied from Flask's url_for(). + """ + reqctx = _request_ctx_stack.top + + # If request specific information is available we have some extra + # features that support "relative" URLs. + if reqctx is not None: + url_adapter = reqctx.url_adapter + blueprint_name = request.blueprint + if not reqctx.request._is_old_module: + if endpoint[:1] == '.': + if blueprint_name is not None: + endpoint = blueprint_name + endpoint + else: + endpoint = endpoint[1:] + else: + # TODO: get rid of this deprecated functionality in 1.0 + if '.' not in endpoint: + if blueprint_name is not None: + endpoint = blueprint_name + '.' + endpoint + elif endpoint.startswith('.'): + endpoint = endpoint[1:] + + return endpoint + + def url_for(endpoint, **values): """ Generates a URL to the given endpoint. @@ -67,6 +95,7 @@ def url_for(endpoint, **values): if app.config['S3_CDN_DOMAIN']: bucket_path = '%s' % app.config['S3_CDN_DOMAIN'] urls = app.url_map.bind(bucket_path, url_scheme=scheme) + endpoint = support_relative_endpoints(endpoint) return urls.build(endpoint, values=values, force_external=True) return flask_url_for(endpoint, **values)