2010-07-20 6 views
35

उपयोगिता कार्यों को Django में कहाँ रहना चाहिए? कस्टम एन्क्रिप्टिंग/एक नंबर को डिक्रिप्ट करना, ट्वीट भेजना, ईमेल भेजना, ऑब्जेक्ट स्वामित्व की पुष्टि करना, कस्टम इनपुट सत्यापन आदि। दोहराव और कस्टम सामान जो मैं अपने ऐप में कई स्थानों पर उपयोग करता हूं। मैं निश्चित रूप से अभी DRY तोड़ रहा हूँ।उपयोगिता कार्यों को Django में कहाँ रहना चाहिए?

मैंने कुछ डेमो देखा जहां मॉडलों.py में कार्यों को परिभाषित किया गया था, हालांकि यह मेरे लिए वैचारिक रूप से सही नहीं लग रहा था। क्या उन्हें एक "उपयोगिताओं" ऐप में जाना चाहिए जो मेरी परियोजना में आयात हो जाता है? यदि हां, तो वे यूटिलिटी ऐप में कहां जाते हैं? वहाँ मॉडल.py फाइल?

इस एन 00 बी आउट करने में मदद के लिए धन्यवाद।

अद्यतन: मुझे और भी विशिष्ट होने दें। मान लें कि मुझे एक फ़ंक्शन "light_encrypt (संख्या)" की आवश्यकता है जो पैरा "संख्या" लेता है, इसे 7 से गुणा करता है, 10 जोड़ता है और परिणाम देता है, और दूसरा फ़ंक्शन "light_decrypt (encr_number) जो पैरा" encr_number "लेता है, 10 घटाता है, 7 से विभाजित होता है और परिणाम देता है। मेरे Django पेड़ में कहां रखा जाएगा? यह मिडलवेयर नहीं है, है ना? फेलिक्स के सुझाव के अनुसार, क्या मैं एक पायथन पैकेज बना सकता हूं और इसे उस दृश्य में आयात कर सकता हूं जहां मुझे इन कार्यों की आवश्यकता है?

+1

आप केवल एक सामान्य पायथन पैकेज बना सकते हैं। –

+1

संबंधित: http://stackoverflow.com/questions/3224902/django-what-is-the-most-ideal-place-to-store-project-specific-middleware/3224926#3224926 – eruciform

उत्तर

19

अलग question लेकिन एक ही जवाब:

एक Django साइट के लिए मेरे सामान्य लेआउट है:

projects/ 
templates/ 
common/ 
local/ 

कहाँ:

  • परियोजनाओं अपने मुख्य परियोजना और किसी भी अन्य
  • आम आप साइट्स पर शेयर कर सकते हैं, या कम से कम परियोजना-विशिष्ट नहीं होते बातें शामिल होता है जैसे आप Django प्रोफाइल डाउनलोड करने की आवश्यकता है, तो और django- पंजीकरण सीधे इसे पाइथन/साइट-पैकेज में रखने के बजाय
  • टेम्पलेट्स में केवल
  • स्थानीय में ऐसी चीजें हैं जो वर्तमान मशीन के लिए विशिष्ट होने जा रही हैं, ताकि आप डेटाबेस स्थान जैसे डेटा को सही ढंग से अलग कर सकें और पासवर्ड - मैं मशीन-विशिष्ट वर्क को नरम-लिंक करता हूं sions ("machine1-localconfig.py" कहें स्थानीय/localconfig.py और फिर सेटिंग.py
  • में मैं आमतौर पर मिडलवेयर डालता हूं जो एक परियोजना के अंदर प्रोजेक्ट-विशिष्ट है, और मिडलवेयर जो परियोजना-विशिष्ट नहीं है सामान्य/मिडलवेयर/
  • सेटिंग में सही स्थान पर टेम्पलेट निर्देशिका को जोड़ना सुनिश्चित करें (या संभवतः, स्थानीय कॉन्फ़िगर करें और फिर इसे सेटिंग्स में आयात करें), और परियोजनाओं, सामान्य, और स्थानीय निर्देशिकाओं को जोड़ने के लिए सुनिश्चित करें आपके पायथनपत के लिए।
+0

प्रतिक्रिया के लिए धन्यवाद, eruciform। तो, मेरे "light_encrypt (संख्या)" उदाहरण के ऊपर, आप सुझाव देंगे कि मैंने इसे सामान्य में रखा है? – mitchf

+1

हाँ, यदि आप इसे एक दिन में किसी अन्य प्रोजेक्ट में उपयोग करने जा रहे हैं, तो इसे 'सामान्य/उपयोग/एन्क्रिप्प्ट' (या जो कुछ भी) में रखना बेहतर है और सुनिश्चित करें कि इसमें किसी भी परियोजना-विशिष्ट के लिए आंतरिक लिंक नहीं हैं । यदि आपको बाद में चीजों को स्थानांतरित करने की आवश्यकता है तो इसे पुन: उपयोग करना आसान होगा, और पोर्ट को भी आसान बनाना होगा। डेटा-छुपा बिंदु दृश्य से भी क्लीनर। :-) – eruciform

+7

ओह, यदि आप इसे 'सामान्य/उपयोग/एन्क्रिप्टेड' में डालते हैं, तो सुनिश्चित करें कि एक खाली 'सामान्य/उपयोग/__ init __। Py' स्पर्श करें ताकि' common.util.encrypt आयात light_encrypt' से ठीक से काम कर सके – eruciform

12

ठीक है, टिप्पणियां पढ़ने और यहाँ का जवाब मैं एक निर्देशिका "आम/util /" अंदर अपने प्रोजेक्ट निर्देशिका कहा जाता है बनाने के लिए तय कर लिया है के बाद। इसके भीतर मेरे पास एक फ़ाइल "__ init__.py" है जहां मेरे छोटे सहायक कार्य हैं।

मुझे लगता है कि फ़ाइल बहुत बड़ी हो जाती है, तो मैं कार्यों को अलग-अलग .py फ़ाइलों में विभाजित कर दूंगा। तो अब, मेरी परियोजना संरचना इस तरह दिखती है। अगर मैं कोई खराब विकल्प बना रहा हूं तो कृपया सही करें, मैं विकास में काफी जल्दी हूं कि अब मैं इसे ठीक कर सकता हूं, जबकि ऐसा करना अभी भी आसान है!

myproject/   (Django project) 
    common/ 
    util/ 
     __init__.py (helper functions) 
    middleware/  (custom middleware) 
    templates/  (project templates) 
    myapp/ 
    fixtures/  (initial data to load) 
    migrations/ (south migrations) 
    urls/ 
    views/ 
    admin.py 
    forms.py 
    models.py 
    test.py 

public/   (static stuff not served by Django) 
    media/ 
    css/ 
    img/ 
    js/ 
    lib/ 
+0

Fwiw, मैं कि ubernostrum एक ही निर्देशिका में utils.py फ़ाइल बनाई रूप urls.py और views.py उसकी उपयोगिता कार्यों – mitchf

+0

धारण करने के लिए जब मैं यहाँ हूँ Django-प्रोफाइल अनुप्रयोग में देखते हैं। मॉड्यूल स्तर पर इच्छित __init__.py चीजों में आयात करने के लिए पाइथन में सामान्य मुहावरे को न भूलें, लेकिन अलग-अलग होने के लिए अपनी फ़ाइल में रहना चाहिए/चाहिए। http://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html उस पर एक अच्छा लिखना है। – Hylidan

1

यहाँ एक और तरीका यह करने के लिए है:

उपयोगिता कार्यों एक स्टैंड-अलोन मॉड्यूल हो सकता है और आप अपने Django एप्लिकेशन के लिए एक virtualenv वातावरण का उपयोग कर रहे है तो आप के रूप में कार्यक्षमता बंडल कर सकते हैं एक पैकेज और इसे अपने virtualenv में स्थापित करें।

इससे आयात करना आसान हो जाता है जहां आपको कभी भी अपने django ऐप में इसकी आवश्यकता होती है।

+2

अच्छा होगा अगर आपने दिखाया कि एक आसान पैकेज कैसे बनाया जाए – dalore

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