मैं वर्तमान में एक अलग s3utils
मॉड्यूल में इस कोड का उपयोग कर रहा हूं :
from django.core.exceptions import SuspiciousOperation
from django.utils.encoding import force_unicode
from storages.backends.s3boto import S3BotoStorage
def safe_join(base, *paths):
"""
A version of django.utils._os.safe_join for S3 paths.
Joins one or more path components to the base path component intelligently.
Returns a normalized version of the final path.
The final path must be located inside of the base path component (otherwise
a ValueError is raised).
Paths outside the base path indicate a possible security sensitive operation.
"""
from urlparse import urljoin
base_path = force_unicode(base)
paths = map(lambda p: force_unicode(p), paths)
final_path = urljoin(base_path + ("/" if not base_path.endswith("/") else ""), *paths)
# Ensure final_path starts with base_path and that the next character after
# the final path is '/' (or nothing, in which case final_path must be
# equal to base_path).
base_path_len = len(base_path) - 1
if not final_path.startswith(base_path) \
or final_path[base_path_len:base_path_len + 1] not in ('', '/'):
raise ValueError('the joined path is located outside of the base path'
' component')
return final_path
class StaticRootS3BotoStorage(S3BotoStorage):
def __init__(self, *args, **kwargs):
super(StaticRootS3BotoStorage, self).__init__(*args, **kwargs)
self.location = kwargs.get('location', '')
self.location = 'static/' + self.location.lstrip('/')
def _normalize_name(self, name):
try:
return safe_join(self.location, name).lstrip('/')
except ValueError:
raise SuspiciousOperation("Attempted access to '%s' denied." % name)
class MediaRootS3BotoStorage(S3BotoStorage):
def __init__(self, *args, **kwargs):
super(MediaRootS3BotoStorage, self).__init__(*args, **kwargs)
self.location = kwargs.get('location', '')
self.location = 'media/' + self.location.lstrip('/')
def _normalize_name(self, name):
try:
return safe_join(self.location, name).lstrip('/')
except ValueError:
raise SuspiciousOperation("Attempted access to '%s' denied." % name)
फिर, मेरी सेटिंग मॉड्यूल में:
DEFAULT_FILE_STORAGE = 'myproyect.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'myproyect.s3utils.StaticRootS3BotoStorage'
मुझे फ़ंक्शन के _normalize_name()
"फिक्स्ड" संस्करण का उपयोग करने के लिए निजी विधि को फिर से परिभाषित करना पड़ा safe_join()
, क्योंकि मूल कोड मुझे SuspiciousOperation
कानूनी नियमों के लिए अपवाद दे रहा है।
मैं इस पर विचार के लिए पोस्ट कर रहा हूं, अगर कोई बेहतर जवाब दे सकता है या इस में सुधार कर सकता है, तो यह बहुत स्वागत योग्य होगा।
AWS_STORAGE_BUCKET_NAME
) को निर्दिष्ट करने के लिए केवल एक ही सेटिंग है , और इसका उपयोग तब किया जाता है जब निर्दिष्ट वर्ग का एक उदाहरणSTATICFILES_STORAGE
त्वरित किया जाता है।