2012-09-21 25 views
9

मैं अमेज़ॅन एस 3 के साथ django-storages का उपयोग कर रहा हूँ।django-storages और amazon s3 - संदिग्धता

name = self._normalize_name(self._clean_name(name))\n\n File \"/app/.heroku/venv/lib/python2.7/site-packages/storages/backends/s3boto.py\", line 237, in _normalize_name\n name)\n\nSuspiciousOperation: Attempted access to 'https:/plantvillage.s3.amazonaws.com/avatar/hans9_avatar.jpg' 

नोट एकल /https: के बाद: मैं त्रुटि निम्नलिखित कुछ हद तक रुक-रुक कर देखते हैं।

क्या कोई जानता है कि यह क्यों दिखाई देता है? यह हर समय नहीं होता है। मैं इसे अन्य मामलों में सफलतापूर्वक कर सकता हूं।

+0

किसी को इसका समाधान मिला है? –

उत्तर

1

मुझे अभी तक अपने स्वयं के प्रोजेक्ट पर काम कर रहे एस 3 स्टोरेज नहीं मिला है, लेकिन मैंने अभी इस त्रुटि में भाग लिया है, और शायद आपको सही दिशा में इंगित करने में सक्षम हो सकता है।

यदि आप S3BotoStorage._clean_name() देखते हैं, तो यह केवल: return os.path.normpath(name).replace('\\', '/') है। os.path.normpath() \\ को // अपने URL में बदल देता है, और उसके बाद .replace() धर्मान्तरित कि करने के लिए \। फिर, S3BotoStorage._normalize_name() यह सुनिश्चित करने के लिए जांच करता है कि यह टूटा हुआ URL उस स्थान का हिस्सा है जो यह दर्शाता है, जो निश्चित रूप से नहीं है। यही वह जगह है जहां संदिग्ध ऑपरेशन त्रुटि उठाई जा रही है।

तो 'नाम' ऐसा लगता है कि यह संपूर्ण एडब्ल्यूएस यूआरएल के बजाय स्थानीय पथ होने का मतलब है। मेरे मामले में, तत्काल कारण 0.pyसेटिंग्स.py में था, जिसे मैंने अनुपलब्ध अपलोड फ़ोल्डर के बारे में एक अलग त्रुटि को ठीक करने की उम्मीद करने का प्रयास किया था।

2

जब आप का उपयोग default_storage तरीकों file.name का उपयोग सुनिश्चित करें:

सही:

default_storage.delete(file.name) 

गलत:

default_storage.delete(file.url) 

गलत:

default_storage.delete(file) 

सभी तीन परीक्षा स्थानीय फाइलों के साथ काम से ऊपर है, लेकिन एस 3 का उपयोग करते समय आप इस त्रुटि में तब तक चले जाएंगे जब तक कि आप file.name का उपयोग न करें।

+0

'file.url' को 'file.name' से अलग तरीके से संसाधित किया जाता है। मैंने यह भी किया है, लेकिन यह एक वास्तविक समाधान की तुलना में एक हैक की तरह लगता है। क्या कोई स्रोत है जो इंगित करता है कि यह वास्तव में सही है, इस तथ्य के अलावा कि यह विधि अपवाद नहीं उठाती है? – Bryan

+0

ऐसा नहीं है कि मुझे पता है। – arctelix

+0

जीवन बचतकर्ता दोस्त। – 101110101100111111101101

0

स्थापना

MEDIA_ROOT='' 

मेरे लिए समस्या तय।

3

_normalize_name यूआरएल के साथ Django सामान पर बहुत अधिक फैंसी और अधिक अनावश्यक करता है। तब

class S3CustomStorage(S3BotoStorage): 
def _normalize_name(self, name): 
    """ 
    Get rid of this crap: http://stackoverflow.com/questions/12535123/django-storages-and-amazon-s3-suspiciousoperation 
    """ 
    return name 

भंडारण संपत्ति में इसका इस्तेमाल करते हैं: मेरे मामले में मैं सिर्फ इस तरह S3BotoStorage ओवरराइड

ImageField(storage=S3CustomStorage()) 

और यह इस आधार विन्यास के साथ Django सरल ImageField के लिए काम किया:

AWS_ACCESS_KEY_ID = 'TTTT' 
AWS_SECRET_ACCESS_KEY = 'XXXX' 
AWS_STORAGE_BUCKET_NAME = 'ZZZZ' 
-1

मैंने इसे ठीक किया, इसके अलावा संदिग्ध ऑपरेशन को जोड़कर:

class S3CustomStorage(S3BotoStorage): 
    def _normalize_name(self, name): 
     try: 
      return safe_join(self.location, name) 
     except (SuspiciousOperation, ValueError): 
      return "" 
संबंधित मुद्दे