From a24098adc0c6f42bb70819554263a71e4e249963 Mon Sep 17 00:00:00 2001 From: Erik Taubeneck Date: Tue, 4 Jun 2013 12:55:17 -0400 Subject: [PATCH 1/3] added S3_CDN_DOMAIN support --- docs/index.rst | 5 +++++ flask_s3.py | 4 ++++ tests/test_flask_static.py | 4 +++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index c6f49d9..a01c7d7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -177,6 +177,11 @@ uploading assets to S3. `S3_BUCKET_DOMAIN` The domain part of the URI for your S3 bucket. You probably won't need to change this. **Default:** ``u's3.amazonaws.com'`` +'S3_CDN_DOMAIN' AWS makes it easy to attach CloudFront to an S3 + bucket. If you want to use this or another CDN, + set the base domain here. This is distinct from the + 'S3_BUCKET_DOMAIN` since it will not include the + bucket name in the base url. `S3_BUCKET_NAME` The desired name for your Amazon S3 bucket. Note: the name will be visible in all your assets' URLs. `S3_USE_HTTPS` Specifies whether or not to serve your assets diff --git a/flask_s3.py b/flask_s3.py index bbb8284..711f390 100644 --- a/flask_s3.py +++ b/flask_s3.py @@ -38,6 +38,8 @@ def url_for(endpoint, **values): scheme = 'https' bucket_path = '%s.%s' % (app.config['S3_BUCKET_NAME'], 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) return urls.build(endpoint, values=values, force_external=True) return flask_url_for(endpoint, **values) @@ -219,8 +221,10 @@ class FlaskS3(object): ('USE_S3', True), ('USE_S3_DEBUG', False), ('S3_BUCKET_DOMAIN', 's3.amazonaws.com'), + ('S3_CDN_DOMAIN', ''), ('S3_USE_CACHE_CONTROL', False), ('S3_HEADERS', {})] + for k, v in defaults: app.config.setdefault(k, v) diff --git a/tests/test_flask_static.py b/tests/test_flask_static.py index a8db00b..3ae0e50 100644 --- a/tests/test_flask_static.py +++ b/tests/test_flask_static.py @@ -29,7 +29,8 @@ class FlaskStaticTest(unittest.TestCase): """ Tests configuration vars exist. """ FlaskS3(self.app) defaults = ('S3_USE_HTTPS', 'USE_S3', 'USE_S3_DEBUG', - 'S3_BUCKET_DOMAIN', 'S3_USE_CACHE_CONTROL', 'S3_HEADERS') + 'S3_BUCKET_DOMAIN', 'S3_CDN_DOMAIN', + 'S3_USE_CACHE_CONTROL', 'S3_HEADERS') for default in defaults: self.assertIn(default, self.app.config) @@ -41,6 +42,7 @@ class UrlTests(unittest.TestCase): self.app.config['S3_BUCKET_NAME'] = 'foo' self.app.config['S3_USE_HTTPS'] = True self.app.config['S3_BUCKET_DOMAIN'] = 's3.amazonaws.com' + self.app.config['S3_CDN_DOMAIN'] = '' @self.app.route('/') def a(url_for_string): From 34445db516c9a67d79cc884584164ffe03e09379 Mon Sep 17 00:00:00 2001 From: Erik Taubeneck Date: Tue, 4 Jun 2013 12:59:49 -0400 Subject: [PATCH 2/3] added tests for S3_CDN_DOMAIN support --- tests/test_flask_static.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_flask_static.py b/tests/test_flask_static.py index 3ae0e50..d566cbd 100644 --- a/tests/test_flask_static.py +++ b/tests/test_flask_static.py @@ -110,6 +110,12 @@ class UrlTests(unittest.TestCase): exp = 'https://foo.s3.amazonaws.com/admin-static/bah.js' self.assertEquals(self.client_get(ufs).data, exp) + def test_url_for_cdn_domain(self): + self.app.config['S3_CDN_DOMAIN'] = 'foo.cloudfront.net' + ufs = "{{url_for('static', filename='bah.js')}}" + exp = 'https://foo.cloudfront.net/static/bah.js' + self.assertEquals(self.client_get(ufs).data, exp) + class S3Tests(unittest.TestCase): From 630deb7c6da8b276062e563250c894fa7abbe76c Mon Sep 17 00:00:00 2001 From: Erik Taubeneck Date: Tue, 11 Jun 2013 14:49:52 -0400 Subject: [PATCH 3/3] added name to CONTRIBUTORS --- CONTRIBUTORS | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 96f3929..e7de847 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -4,3 +4,4 @@ Contributors * Edward Robinson (e-dard) * Rehan Dalal (rehandalal) * Hannes Ljungberg (hannseman) +* Erik Taubeneck (eriktaubeneck)