diff --git a/flask_s3.py b/flask_s3.py index fec208b..5d9957c 100644 --- a/flask_s3.py +++ b/flask_s3.py @@ -33,8 +33,20 @@ def url_for(endpoint, **values): scheme = 'http' if app.config['S3_USE_HTTPS']: scheme = 'https' - bucket_path = '%s.%s' % (app.config['S3_BUCKET_NAME'], - app.config['S3_BUCKET_DOMAIN']) + + if app.config['S3_URL_STYLE'] == 'host': + url_format = '%(bucket_name)s.%(bucket_domain)s' + elif app.config['S3_URL_STYLE'] == 'path': + url_format = '%(bucket_domain)s/%(bucket_name)s' + else: + raise ValueError('Invalid S3 URL style: "%s"' + % app.config['S3_URL_STYLE']) + + bucket_path = url_format % { + 'bucket_name': app.config['S3_BUCKET_NAME'], + 'bucket_domain': app.config['S3_BUCKET_DOMAIN'], + } + if app.config['S3_CDN_DOMAIN']: bucket_path = '%s' % app.config['S3_CDN_DOMAIN'] urls = app.url_map.bind(bucket_path, url_scheme=scheme) diff --git a/tests/test_flask_static.py b/tests/test_flask_static.py index d4ba9f1..d404229 100644 --- a/tests/test_flask_static.py +++ b/tests/test_flask_static.py @@ -122,6 +122,18 @@ def test_url_for_cdn_domain(self): exp = 'https://foo.cloudfront.net/static/bah.js' self.assertEquals(self.client_get(ufs).data, exp) + def test_url_for_url_style_path(self): + """Tests that the URL returned uses the path style.""" + self.app.config['S3_URL_STYLE'] = 'path' + ufs = "{{url_for('static', filename='bah.js')}}" + exp = 'https://s3.amazonaws.com/foo/static/bah.js' + self.assertEquals(self.client_get(ufs).data, exp) + + def test_url_for_url_style_invalid(self): + """Tests that an exception is raised for invalid URL styles.""" + self.app.config['S3_URL_STYLE'] = 'balderdash' + ufs = "{{url_for('static', filename='bah.js')}}" + self.assertRaises(ValueError, self.client_get, ufs) class S3Tests(unittest.TestCase):