2010-01-14 9 views
13

पृष्ठभूमि:Django ऐप्स को स्थिर मीडिया कैसे बंडल करना चाहिए?

मैं पहली बार है, जो भी मेरी वेब विकास में प्रथम प्रयास है के लिए Django उपयोग करने के लिए शुरू कर रहा हूँ। मैं बस पूरे "सेवारत स्थिर मीडिया" समस्या पर फंस गया। सभी दस्तावेज और स्टैक ओवरफ्लो प्रश्नों को देखते हुए कुछ समय बिताने के बाद, मुझे लगता है कि मैं समझता हूं कि यह कैसे काम करना है (यानी MEDIA_ROOT, MEDIA_URL, यूआरएल फ़ाइल अपडेट करना आदि)।

मेरे प्रश्न:

ठीक है, इसलिए यहाँ भाग मैं बारे में निश्चित नहीं हूँ। Django अनुप्रयोगों को "प्लग करने योग्य" माना जाता है, यानी मैं एक परियोजना से दूसरे प्रोजेक्ट में एक एप्लिकेशन ले जा सकता हूं। तो, इन अनुप्रयोगों को स्थिर मीडिया कैसे बंडल करना चाहिए?

उदाहरण के लिए, मान लें कि मेरे पास "foo" एप्लिकेशन है, जिसमें टेम्पलेट्स हैं जो कुछ सीएसएस/छवि फ़ाइलों को लोड करते हैं। मुझे इन फ़ाइलों को कहां रखना है, ताकि एप्लिकेशन को शामिल करने के बाद वे स्वचालित रूप से सेवा प्राप्त कर सकें?

एकमात्र समाधान जो मैं देखता हूं, यह है कि किसी एप्लिकेशन को इंस्टॉल करने के लिए उस मीडिया को सेवा देने वाले अपने सर्वर पर किसी भी स्थान पर अपने स्थिर मीडिया को कॉपी करने का अतिरिक्त चरण शामिल करना होता है।

क्या यह करने का यह स्वीकार्य तरीका है? इसमें एक अतिरिक्त कदम शामिल है, लेकिन वेब-देव से निपटने पर यह मानक है (मैं नया हूं इसलिए मुझे वास्तव में पता नहीं है)।

इसके अलावा, अगर यह तरीका है, तो मेरे सभी स्थिर मीडिया को इकट्ठा करने का एक मानक तरीका है जिससे मुझे यह जानना आसान हो कि मुझे सेवा करने की क्या ज़रूरत है? (यानी, क्या यह "मीडिया" नामक फ़ोल्डर या ऐप के अंदर कुछ है?)।

धन्यवाद,

उत्तर

9

कन्वेंशन एप्लिकेशन (टेम्पलेट्स के समान) के भीतर/या तो मीडिया/APPNAME/या स्थिर/APPNAME में स्थिर मीडिया डाल करने के लिए है।

मीडिया के साथ आने वाली आपकी परियोजना में ऐप्स का उपयोग करने के लिए, मैं django-staticfiles का उपयोग करने की दृढ़ता से अनुशंसा करता हूं। यह स्वचालित रूप से विकास में मीडिया (ऐप्स के भीतर मीडिया सहित) की सेवा करेगा जो django.views.static.serve को प्रतिस्थापित करता है, और यह build_static प्रबंधन कमांड के साथ आता है जो उत्पादन में सेवा के लिए सभी ऐप्स से मीडिया को एक ही निर्देशिका में कॉपी करेगा।

अद्यतन: django-staticfiles become part of Django 1.3 है। अब ऐप मीडिया ऐप की "स्थैतिक /" उपनिर्देशिका में रहने की अपेक्षा करता है, न कि "मीडिया /"। और प्रबंधन कमांड अब "संग्रहित" है।

+0

यह अब Django 1.3 के रूप में सही दृष्टिकोण है। –

+1

ध्यान दें कि https://github.com/jaddison/django-cachebuster/ Django 1.3 के लिए एक बहुत उपयोगी {% स्थिर%} टैग प्रदान करता है – Eli

2

मुझे लगता है कि के बारे में पता ही एप्लिकेशन को किसी भी हस्तक्षेप के बिना इस के साथ संबंधित है, बल्कि अद्भुत django-debug-toolbar है, हालांकि यह, विवाद-योग्य है कि यह एक बहुत अच्छा उदाहरण नहीं है, क्योंकि यह एक ऐप्लिकेशन विशेष रूप से डिबग मोड के लिए बनाया गया है केवल।

जिस तरह से यह यह के साथ संबंधित है कि यह Django खुद के माध्यम से अपने मीडिया में कार्य करता है - urls.py के लिए स्रोत देखें:

url(r'^%s/m/(.*)$' % _PREFIX, 'debug_toolbar.views.debug_media'), 

सामान्य तौर पर, यह एक बुरा विचार है (आप स्थिर सेवा करने के लिए नहीं करना चाहते हैं Django के माध्यम से फ़ाइलें), this comment from the documentation प्रति:

[Django के माध्यम से स्थिर फ़ाइलों सेवित] अक्षम है और असुरक्षित। उत्पादन सेटिंग में इसका उपयोग न करें। इसे केवल विकास के लिए उपयोग करें।

जाहिर है, डीजेंगो-डीबग-टूलबार का उपयोग केवल विकास के लिए किया जाता है, इसलिए मुझे लगता है कि तैनाती की विधि समझ में आता है, लेकिन यह बहुत अपवाद है।

सामान्य रूप से, मुझे यह करने का सबसे अच्छा तरीका है कि जहां भी आपका मीडिया आपके ऐप कोड के अंदर मीडिया में संग्रहीत हो, प्रतीकात्मक लिंक बनाना है। उदाहरण के लिए, अपने ऐप के भीतर media नामक फ़ोल्डर बनाएं, और फिर उपयोगकर्ताओं को अपने ऐप को इंस्टॉल करने की आवश्यकता होती है ताकि वे अपनी मीडिया निर्देशिका से प्रतीकात्मक लिंक जोड़ सकें या पूरी चीज की प्रतिलिपि बना सकें।

+0

और मुझे अपने कोड में क्लैम्स नामकरण/इसका संदर्भ कैसे लेना चाहिए? यदि मेरे पास मीडिया फ़ोल्डर के साथ एक "foo" ऐप है और मीडिया फ़ोल्डर के साथ "बार" ऐप है, तो मैं समस्याओं के कारण बिना एप्लिकेशन टेम्पलेट्स के अंदर फ़ोल्डर को कैसे संदर्भित करूं? –

+1

यदि आपके ऐप को 'foobar' कहा जाता है, तो' {{MEDIA_URL}} foobar/myawesomejs.js' का उपयोग करके अपने मीडिया का संदर्भ लें। अपने उपयोगकर्ताओं को अपने मीडिया निर्देशिका में 'foobar' पर symlink सेट करने की आवश्यकता है। –

+0

मुझे लगता है कि नीचे मेरा जवाब (django-staticfiles का उपयोग करके) एक बेहतर आसपास के समाधान है; विशेष रूप से ऐसा लगता है कि staticfiles के आधार पर कुछ ऐसा लगता है जो सीधे Django 1.3 में शामिल किया जा सकता है। –

2

मैं आमतौर पर ऐप मीडिया डालता हूं।/ Apps/APPNAME/स्थिर (मेरी क्षुधा एक क्षुधा सबफ़ोल्डर में रहता है)

तो मैं अपाचे में vhost में कुछ इसी तरह की है:

AliasMatch ^/apps/([^/]+)/static/(.*) /home/django/projectname/apps/$1/static/$2 
<DirectoryMatch "^/home/django/projectname/apps/([^/]+)/static/*"> 
     Order deny,allow 
     Options -Indexes 
     deny from all 
     Options +FollowSymLinks 
     <FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|txt|htm|html|json)$"> 
       allow from all 
     </FilesMatch> 
</DirectoryMatch> 

मैं भी डेव सर्वर के लिए मेरे urls.py में इस राशि (केवल डिबग के लिए) का उपयोग करें:

def statics_wrapper(request, **dict): 
    from django.views import static 
    return static.serve(request, dict['path'], document_root = os.path.join(settings.BASE_DIR, 'apps', dict['app'], 'static'), show_indexes=True) 
urlpatterns += patterns('', (r'^apps/(?P<app>[^/]+)/static/(?P<path>.+)$', statics_wrapper)) 

यह बहुत आसान है, क्योंकि स्टैटिक्स यूआरएल बस, फ़ाइल सिस्टम पर मैप किए जाते जैसे:

http://wwww.ecample.com/apps/calendar/static/js/calendar.js [BASE_DIR]/apps/calend में रहता है ए आर/स्थिर/js/calendar.js

आशा है कि यह मदद करता है

संबंधित मुद्दे