2009-12-23 17 views
26

अपलोड की गई छवियों को हटाने का प्रयास करते समय मैं एक समस्या में भाग रहा हूं।संदिग्ध ऑपरेशन Django

त्रुटि इन पंक्तियों के साथ है:

SuspiciousOperation: Attempted access to '/media/artists/12-stones/154339.jpg' denied. 

पढ़ने के आसपास यह त्रुटि की तरह ही दिखाई देने लगे हैं कि यह गलत जगह पर छवि की तलाश में (पहले स्लैश नोटिस तथ्य के कारण है,/मीडिया/नहीं करता है 'टी फाइल सिस्टम पर मौजूद हैं)

मेरे MEDIA_ROOT और MEDIA_URL हैं:

MEDIA_ROOT = '/home/tsoporan/site/media/' 
MEDIA_URL = "/media/ 

मेरे मॉडल upload_to पैरामीटर इस समारोह पारित हो जाता है:

def get_artist_path(instance, filename): 
    return os.path.join('artists', slugify(instance.name), filename) 

मेरे प्रश्न हैं:

1) मैं भविष्य के अपलोड के लिए इस समस्या का समाधान कैसे कर सकते हैं?

2) क्या मेरे वर्तमान छवियों के पथ को फिर से लोड किए बिना ठीक करना संभव है?

सादर, टाइटस

+0

आप स्टैटिक फ़ाइलें कैसे की सेवा कर रहे हैं? स्थिर फाइलों के लिए आप किस यूआरएल का उपयोग कर रहे हैं। – czarchaic

+0

अपाचे के ProxyPass के माध्यम से nginx के साथ स्थिर फ़ाइलों सेवित: तरह: ProxyPass/मीडिया http: // localhost: 5000/ ProxyPassReverse/मीडिया http: // localhost: 5000/ – tsoporan

+0

संपादित करें: ऊपर टिप्पणी छीन लिया देखें http://dpaste.com/hold/136840/ – tsoporan

उत्तर

29

ठीक है, कोड में चारों ओर एक छोटे से grepping पता चलता है कि रास्ते में homogenized गया एक गहरी त्रुटि संदेश हो सकता है।

Django/कोर/फ़ाइलें/storage.py, लाइन 210 में

(इस 1.1.1 में है) हमने:

def path(self, name): 
    try: 
     path = safe_join(self.location, name) 
    except ValueError: 
     raise SuspiciousOperation("Attempted access to '%s' denied." % name) 
    return smart_str(os.path.normpath(path)) 

तो त्रुटि है safe_join से बाहर आ जा करने के लिए()।

django/utils/_os.py में, हमारे पास निम्नलिखित हैं। नोट ValueError यह अंतिम पंक्ति के लिए तीसरे पर फेंकता है:

===========================

def safe_join(base, *paths): 
    """ 
    Joins one or more path components to the base path component intelligently. 
    Returns a normalized, absolute version of the final path. 

    The final path must be located inside of the base path component (otherwise 
    a ValueError is raised). 
    """ 
    # We need to use normcase to ensure we don't false-negative on case 
    # insensitive operating systems (like Windows). 
    base = force_unicode(base) 
    paths = [force_unicode(p) for p in paths] 
    final_path = normcase(abspathu(join(base, *paths))) 
    base_path = normcase(abspathu(base)) 
    base_path_len = len(base_path) 
    # Ensure final_path starts with base_path and that the next character after 
    # the final path is os.sep (or nothing, in which case final_path must be 
    # equal to base_path). 
    if not final_path.startswith(base_path) \ 
     or final_path[base_path_len:base_path_len+1] not in ('', sep): 
     raise ValueError('the joined path is located outside of the base path' 
         ' component') 
    return final_path 

==================

हम्म, "शामिल पथ बेस पथ घटक के बाहर स्थित है"। अब वहां abspathu() में कुछ कॉल हैं (जिसे इस दिनचर्या के ठीक ऊपर परिभाषित किया गया है और अन्य ओएस के मुकाबले एनटी के लिए अलग है)। abspathu() os.cwdu(), वर्तमान कार्यशील निर्देशिका पर tacking द्वारा सभी गैर-पूर्ण पथ को पूर्ण करने के लिए परिवर्तित करता है।

प्रश्न: किसी भी मौके से आपके पास अपनी मीडिया निर्देशिका में एक सिम्लिंक (प्रतीकात्मक लिंक) है? दूसरे शब्दों में, यह प्रोजेक्ट निर्देशिका का प्रत्यक्ष बच्चा नहीं है? मुझे नहीं पता कि यह एक वैध सवाल है, यह सिर्फ मेरे सिर से बाहर निकला।

प्रश्न: self.location और name के मूल्यों कि safe_join के लिए पारित किया जा रहा है कर रहे हैं()?

जंगली-गधा अनुमान: self.location खाली है?

एक और जंगली-गधा अनुमान: क्या MEDIA_ROOT किसी भी तरह /media/ में बदल गया?

यदि आपके पास डीजेंगो की अपनी प्रतिलिपि स्थापित है (यह करना मुश्किल नहीं है), इन दिनचर्या में कुछ प्रिंट स्टेटमेंट डालने का प्रयास करें और फिर इसे विकास सर्वर के रूप में चलाएं। प्रिंट आउटपुट कंसोल पर जाएगा।

अद्यतन: हमम। आपने कहा "2) आत्म.लोकेशन और नाम के लिए मूल्य हैं:/home/tsoporan/साइट/मीडिया और /media/albums/anthem-for-the-underdog/30103635.jpg"

क्या निम्न पथ बनाता है कोई मतलब है?

"/home/tsoporan/site/media/media/albums/anthem-for-the-underdog" 

ध्यान दें .../मीडिया/मीडिया/... में।

इसके अलावा, यह ओएस क्या है? Django rev?

+0

1) नहीं, मेरे पास मेरी मीडिया निर्देशिका का प्रतीकात्मक लिंक नहीं है। 2) स्वयं। स्थान और नाम के लिए मूल्य हैं: /घर/tsoporan/साइट/मीडिया और /media/albums/anthem-for-the-underdog/30103635.jpg - (यह एक एल्बम के लिए है लेकिन समस्या कलाकार या एल्बम के लिए समान है) 3) self.location खाली नहीं है। 4) MEDIA_ROOT अभी भी वही है जो मुझे विश्वास है। – tsoporan

+0

ऊपर मेरे अपडेट नोट करें। यह एक टिप्पणी में इसे थोड़ा सा स्वरूपित किया गया होगा। –

2

आह ने इसे थोड़ा शर्मनाक महसूस किया, लेकिन यह पता चला कि त्रुटि अधिक थी। मैं इन छवियों को एक स्क्रिप्ट द्वारा प्लग कर रहा था और इसे फिर से चलाते हुए महसूस किया कि मेरे पथ/मीडिया/के साथ शुरू हुए।

अब मेरे पास गलत पथ के साथ लगभग 4000 छवियां हैं ... क्या इन सभी छवियों के पथों को किसी भी तरह से संशोधित करने का कोई तरीका है? या फिर से अपलोड करने की आवश्यकता होगी?

सभी को धन्यवाद, मेरी गलती के लिए क्षमा चाहते हैं।

+0

नीचे मेरा जवाब देखें ... –

2

आपको वास्तव में इस पर एक नया प्रश्न पूछना चाहिए। निम्नलिखित का प्रयास करें:

from django.core.management import setup_environ 
from mysite import settings 
setup_environ(settings) 
from django.db import transaction 

from app.models import Album # or whatever your model name is 

for a in Album.objects.all(): 
    # Do something to cleanup the filename. 
    # NOTE! This will not move the files, just change the value in the field. 
    a.filename = re.sub(r'^/media', '', a.filename) 
    a.save() 

transaction.commit_unless_managed() # flush all changes 
56

मुझे यह त्रुटि मिली जब मैंने upload_to परिभाषा में अग्रणी स्लैश लगाया।

खराब

pic = models.ImageField(upload_to="/uploads/product_images/") 

अच्छा

pic = models.ImageField(upload_to="uploads/product_images/") 
+0

यह जाने का रास्ता है। डॉक्स - [upload_to] (http://django.me/upload_to) –

1

आप इस तरह के रूप में/डेटा/images/myFile /, आप आप MEDIA_ROOT लिए/डेटा/Django सेटिंग्स में छवियों स्थापित करना चाहिए अन्य स्थान, का उपयोग करना चाहते हैं .py फ़ाइल।

9

दूसरों के लिए एक नोट के रूप में यह समस्या तब हो सकती है जब आपके पास स्थिर फ़ाइल संसाधन में डबल '//' होता है।

{{ STATIC_URL }}/style.css # Causes the issue it should be 
{{ STATIC_URL }}style.css 
+0

आपको अधिक वोट चाहिए। यह मेरे सेटअप में मुद्दा पैदा कर रहा था। धन्यवाद! – Javier

+0

मेरे लिए एक ही मुद्दा .... मजेदार है कि यह 'Nginx' के पीछे या 'manage.py runerver' के पीछे उत्पादन में नहीं हो रहा था। लेकिन मेरे पास महीनों के लिए अतिरिक्त '/' है और मैंने केवल तभी खोज की जब मैं 'गनिकोर्न' से 'uwsgi' में स्विच करने की कोशिश कर रहा था और उसे स्थानीय रूप से 'uwsgi' का परीक्षण करना पड़ा। – danidee

+0

मेरी ओर से भी धन्यवाद, बिल्कुल मेरे पास मुद्दा था! –

-1

मुझे यह त्रुटि भी मिली। मुझे पता चला कि निम्नलिखित अपवाद उठाया जा रहा है।

SuspiciousOperation(u"Attempted access to '2015-03-19-08:29:51-2-f8945842891244629dfd0c0af4c72a9c.pdf' denied.",) 

Btw, मैं उपयोग कर रहा हूँ Django-भंडार (v1.1.8) पर एस 3 (S3boto बैकएंड का प्रयोग करके) अपने मीडिया फ़ाइलों को स्टोर करने के लिए। मैं django 1.7.6 का उपयोग कर रहा हूँ।

लेकिन अगर मैं आउट कॉलन के साथ फ़ाइल नाम के साथ स्टोर करने के लिए स्विच करता हूं (:) ऐसा लगता है कि यह काम करता है। मैंने अभी तक पता नहीं लगाया है कि मूल कारण क्या है। अगर यह किसी और के लिए उपयोगी है तो बस इसे पोस्ट करना। जाहिर है, django या django-storages कोलन के साथ फ़ाइल नाम पसंद नहीं है।

0

मुझे पता चला कि गूंगा print कथन का उपयोग करके, कुछ मीडिया फ़ाइलों में /media उनके यूआरएल पथों में उपसर्ग है। जबकि डिफ़ॉल्ट स्टोरेज विकल्प इसे संभालता है, तो django-storages से आप एक समस्या है।

तो मैं यह _normalize_name (@ पीटर-Rowell द्वारा जवाब द्वारा निर्देशित) अधिभावी द्वारा तय:

class MediaStorage(FixedUrlBotoStorage): 
    location = settings.MEDIAFILES_LOCATION 

    # Overriding function because some media files are stored with '/media' prefixed (which causes problems) 
    def _normalize_name(self, name): 
     if name.startswith('/media'): 
      name = name.lstrip('/media') 
     return super(MediaStorage, self)._normalize_name(name) 
संबंधित मुद्दे