@@ -134,6 +134,12 @@ class S3Store(Store):
134
134
:param prefix: the optional key prefix to logically separate stores
135
135
with the same bucket. not used by default
136
136
:type prefix: :class:`basestring`
137
+ :param public_base_url: an optional url base for public urls.
138
+ useful when used with cdn
139
+ :type public_base_url: :class:`basestring`
140
+
141
+ .. versionchanged:: 0.8.1
142
+ Added ``public_base_url`` parameter.
137
143
138
144
"""
139
145
@@ -150,16 +156,25 @@ class S3Store(Store):
150
156
#: stores with the same bucket.
151
157
prefix = None
152
158
159
+ #: (:class:`basestring`) The optional url base for public urls.
160
+ public_base_url = None
161
+
153
162
def __init__ (self , bucket , access_key = None , secret_key = None ,
154
- max_age = DEFAULT_MAX_AGE , prefix = '' ):
163
+ max_age = DEFAULT_MAX_AGE , prefix = '' , public_base_url = None ):
155
164
self .bucket = bucket
156
165
self .access_key = access_key
157
166
self .secret_key = secret_key
158
167
self .base_url = BASE_URL_FORMAT .format (bucket )
159
168
self .max_age = max_age
160
169
self .prefix = prefix .strip ()
161
170
if self .prefix .endswith ('/' ):
162
- self .prefix = self .prfix [:- 1 ]
171
+ self .prefix = self .prefix .rstrip ('/' )
172
+ if public_base_url is None :
173
+ self .public_base_url = self .base_url
174
+ elif public_base_url .endswith ('/' ):
175
+ self .public_base_url = public_base_url .rstrip ('/' )
176
+ else :
177
+ self .public_base_url = public_base_url
163
178
164
179
def get_key (self , object_type , object_id , width , height , mimetype ):
165
180
key = '{0}/{1}/{2}x{3}{4}' .format (
@@ -171,16 +186,22 @@ def get_key(self, object_type, object_id, width, height, mimetype):
171
186
return key
172
187
173
188
def get_file (self , * args , ** kwargs ):
174
- url = self .get_url (* args , ** kwargs )
189
+ url = self .get_s3_url (* args , ** kwargs )
175
190
request = self .make_request (url )
176
191
return urllib2 .urlopen (request )
177
192
178
- def get_url (self , * args , ** kwargs ):
193
+ def get_s3_url (self , * args , ** kwargs ):
179
194
return '{0}/{1}' .format (
180
195
self .base_url ,
181
196
self .get_key (* args , ** kwargs )
182
197
)
183
198
199
+ def get_url (self , * args , ** kwargs ):
200
+ return '{0}/{1}' .format (
201
+ self .public_base_url ,
202
+ self .get_key (* args , ** kwargs )
203
+ )
204
+
184
205
def make_request (self , url , * args , ** kwargs ):
185
206
return S3Request (url , * args ,
186
207
bucket = self .bucket ,
@@ -219,11 +240,11 @@ def upload_file(self, url, data, content_type, rrs, acl='public-read'):
219
240
220
241
def put_file (self , file , object_type , object_id , width , height , mimetype ,
221
242
reproducible ):
222
- url = self .get_url (object_type , object_id , width , height , mimetype )
243
+ url = self .get_s3_url (object_type , object_id , width , height , mimetype )
223
244
self .upload_file (url , file .read (), mimetype , rrs = reproducible )
224
245
225
246
def delete_file (self , * args , ** kwargs ):
226
- url = self .get_url (* args , ** kwargs )
247
+ url = self .get_s3_url (* args , ** kwargs )
227
248
request = self .make_request (url , method = 'DELETE' )
228
249
urllib2 .urlopen (request ).read ()
229
250
@@ -311,7 +332,7 @@ def put_file(self, *args, **kwargs):
311
332
def delete_file (self , object_type , object_id , width , height , mimetype ):
312
333
args = object_type , object_id , width , height , mimetype
313
334
self .overriding .delete_file (* args )
314
- url = self .overriding .get_url (* args )
335
+ url = self .overriding .get_s3_url (* args )
315
336
self .overriding .upload_file (
316
337
url ,
317
338
data = b'' ,
0 commit comments