2008-10-20 13 views
138

मेरे पास Bluehost खाता है जहां मैं पाइथन स्क्रिप्ट को CGI के रूप में चला सकता हूं। मुझे लगता है कि यह सबसे सरल सीजीआई है, क्योंकि चलाने के लिए मैं .htaccess में निम्नलिखित को परिभाषित करने के लिए है:कैसे पाइथन वेब ढांचे, डब्ल्यूएसजीआई और सीजीआई एक साथ फिट

Options +ExecCGI 
AddType text/html py 
AddHandler cgi-script .py 

अब, जब भी मैं अजगर के साथ वेब प्रोग्रामिंग देखो, मैं WSGI और कैसे सबसे चौखटे इसका इस्तेमाल के बारे में बहुत सुना है। लेकिन मुझे समझ में नहीं आता कि यह सब कैसे एक साथ फिट बैठता है, खासकर जब मेरा वेब सर्वर दिया जाता है (अपाचे एक मेजबान की मशीन पर चल रहा है) और कुछ ऐसा नहीं जो मैं वास्तव में खेल सकता हूं (.htaccess कमांड को परिभाषित करने के अलावा)।

WSGI, सीजीआई और सभी जुड़े हुए ढांचे कैसे हैं? अगर मैं अपने मूल सीजीआई कॉन्फ़िगरेशन पर वेब फ्रेमवर्क (web.py या CherryPy कहूं) चलाने के लिए मुझे क्या जानना, इंस्टॉल करना और करना है? WSGI समर्थन कैसे स्थापित करें?

उत्तर

220

डब्ल्यूएसजीआई, सीजीआई, और ढांचे सभी कैसे जुड़े हुए हैं?

अपाचे पोर्ट 80 पर सुनता है। यह HTTP अनुरोध प्राप्त करता है। यह जवाब देने का एक तरीका खोजने का अनुरोध करता है। अपाचे के पास जवाब देने के लिए बहुत सारे विकल्प हैं। जवाब देने का एक तरीका है स्क्रिप्ट चलाने के लिए सीजीआई का उपयोग करना। जवाब देने का एक और तरीका बस एक फाइल की सेवा करना है।

सीजीआई के मामले में, अपाचे एक पर्यावरण तैयार करता है और सीजीआई प्रोटोकॉल के माध्यम से स्क्रिप्ट को आमंत्रित करता है। यह एक मानक यूनिक्स फोर्क/एक्ज़ेक स्थिति है - सीजीआई सबप्रोसेस को सॉकेट और स्टडआउट समेत ओएस पर्यावरण प्राप्त होता है। सीजीआई सबप्रोसेस एक प्रतिक्रिया लिखता है, जो अपाचे पर वापस जाता है; अपाचे ब्राउज़र को यह प्रतिक्रिया भेजता है।

सीजीआई आदिम और कष्टप्रद है। अधिकांशतः क्योंकि यह प्रत्येक अनुरोध के लिए एक उपप्रजाति का त्याग करता है, और उपप्रोसेस को प्रतिक्रिया के अंत को इंगित करने के लिए बाहर निकलना या stdout और stderr को बंद करना होगा।

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

डब्लूएसजीआई कई महत्वपूर्ण तरीकों से सीजीआई डिजाइन पैटर्न में जोड़ता है। यह आपके लिए HTTP अनुरोध शीर्षलेखों को पार करता है और इन्हें पर्यावरण में जोड़ता है। यह किसी भी पोस्ट-उन्मुख इनपुट को पर्यावरण में फ़ाइल जैसी वस्तु के रूप में प्रदान करता है। यह आपको एक ऐसा फ़ंक्शन भी प्रदान करता है जो आपको फ़ॉर्मेटिंग विवरणों से बचाने के लिए प्रतिक्रिया तैयार करेगा।

यदि मैं वेब ढांचा चलाने के लिए चाहता हूं तो मुझे क्या पता/इंस्टॉल/करने की आवश्यकता है (वेब ​​कहें।पीई या चेरीपी) मेरे मूल सीजीआई विन्यास पर?

याद रखें कि एक उपप्रोसेसर को मजबूती देना महंगा है। इस के आसपास काम करने के दो तरीके हैं।

  1. एंबेडेडmod_wsgi या mod_python अपाचे अंदर अजगर को एम्बेड करता है; कोई प्रक्रिया फोर्क नहीं है। अपाचे सीधे Django आवेदन चलाता है।

  2. Daemonmod_wsgi या mod_fastcgi अपाचे, एक अलग डेमॉन (या "लंबी चलने वाली प्रक्रिया") के साथ बातचीत करने WSGI प्रोटोकॉल का उपयोग की अनुमति देता है। आप अपनी लंबी दौड़ वाली Django प्रक्रिया शुरू करते हैं, फिर आप इस प्रक्रिया के साथ संवाद करने के लिए अपाचे के mod_fastcgi को कॉन्फ़िगर करते हैं।

ध्यान दें कि mod_wsgi या तो मोड में काम कर सकते हैं: एम्बेडेड या डेमॉन।

जब आप mod_fastcgi पर पढ़ते हैं, तो आप देखेंगे कि Django mod_fastcgi द्वारा प्रदान की गई जानकारी से WSGI- संगत इंटरफ़ेस बनाने के लिए का उपयोग करता है। पाइपलाइन इस तरह काम करता है।

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol) 

Django कई इंटरफेस के लिए कई "django.core.handlers" है।

mod_fastcgi के लिए, Django एक manage.py runfcgi प्रदान करता है जो FLUP और हैंडलर को एकीकृत करता है।

mod_wsgi के लिए, इसके लिए एक कोर हैंडलर है।

WSGI समर्थन कैसे स्थापित करें?

इन निर्देशों का पालन करें।

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

पृष्ठभूमि के लिए इस

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index

+3

मैं mod_wsgi स्थापित नहीं कर सकता क्योंकि मैं साझा होस्टिंग पर हूं। मेरे पास एफसीजीआई समर्थन है। मैं अभी भी इसके माध्यम से डब्लूएसजीआई ऐप्स कैसे चला सकता हूं? –

+3

+1 एक उत्कृष्ट उत्तर है और मेरे मन में बहुत सारे प्रश्न हैं (लेकिन सभी नहीं) प्रश्न। यह उत्तर अभी भी पूरा नहीं हुआ है। आपने सीजीआई और डब्लूएसजीआई के बारे में अच्छी तरह से समझाया लेकिन फास्टसीजीआई और डब्लूएसजीआई के बीच संबंध और मतभेद क्या हैं? कौनसा अच्छा है? वो कैसे काम करते है? Mod_python तस्वीर में कैसे आया? – claws

+1

@claws: कृपया यह न पूछें कि "बेहतर" कौन सा है। सवाल मूर्खतापूर्ण है। क्या बेहतर है? सस्ता? और तेज? कम स्मृति का उपयोग करता है? सबसे प्रोग्रामिंग शामिल है? लगभग हर कोई mod_wsgi का उपयोग करता है क्योंकि यह सबकुछ करता है। –

21

आप उदाहरण के रूप में run WSGI over CGI as Pep333 demonstrates कर सकते हैं। हालांकि हर बार एक नया पायथन दुभाषिया शुरू करने का अनुरोध होता है और पूरे संदर्भ (डेटाबेस कनेक्शन इत्यादि) को बनाने की आवश्यकता होती है जो सभी समय लेते हैं।

यदि आप WSGI को चलाने के लिए सबसे अच्छा चाहते हैं तो सबसे अच्छा होगा यदि आपका होस्ट mod_wsgi इंस्टॉल करेगा और आपके आवेदन के नियंत्रण को नियंत्रित करने के लिए उचित कॉन्फ़िगरेशन करेगा।

Flup किसी भी वेबसर्वर के लिए डब्लूएसजीआई के साथ चलाने का एक और तरीका है जो FCGI, SCGI या AJP बोल सकता है। मेरे अनुभव से केवल एफसीजीआई वास्तव में काम करता है, और इसका उपयोग अपाचे में mod_fastcgi के माध्यम से किया जा सकता है या यदि आप mod_proxy_fcgi के साथ एक अलग पायथन डिमन चला सकते हैं।

WSGI सीजीआई की तरह एक प्रोटोकॉल है, जो नियमों का एक सेट परिभाषित करता है कि वेबसर्वर और पायथन कोड कैसे बातचीत कर सकते हैं, इसे Pep333 के रूप में परिभाषित किया गया है। यह संभव बनाता है कि कई अलग-अलग वेबसर्वर एक ही एप्लिकेशन प्रोटोकॉल का उपयोग करके कई अलग-अलग ढांचे और अनुप्रयोगों का उपयोग कर सकें। यह बहुत फायदेमंद है और इसे इतना उपयोगी बनाता है।

+3

सीजीआई पर डब्लूएसजीआई चल रहा है "फ्लूप" क्या है? इस योजना से फ्लूप कैसे जुड़ा हुआ है? –

54

मुझे लगता है कि Florian's answer "डब्लूएसजीआई क्या है" के बारे में आपके प्रश्न के हिस्से का जवाब देता है, खासकर यदि आप the PEP पढ़ते हैं।

प्रश्न अंत में मुद्रा के लिए के रूप में:

WSGI, सीजीआई, FastCGI आदि रन कोड करने के लिए एक वेब सर्वर के लिए सभी प्रोटोकॉल कर रहे हैं, और गतिशील सामग्री उत्पादन किया है कि उद्धार। इसकी तुलना स्थिर वेब सेवा से करें, जहां एक सादा HTML फ़ाइल मूल रूप से क्लाइंट के रूप में वितरित की जाती है।

सीजीआई, फास्टसीजीआई और एससीजीआई भाषा अज्ञेयवादी हैं। आप पर्ल, पायथन, सी, बैश, जो भी हो, में सीजीआई स्क्रिप्ट लिख सकते हैं। सीजीआई परिभाषित करता है जो निष्पादन योग्य यूआरएल के आधार पर, और कैसे कहा जाएगा: तर्क और पर्यावरण। यह भी परिभाषित करता है कि आपके निष्पादन योग्य होने के बाद वापसी मूल्य को वेब सर्वर पर वापस कैसे भेजा जाना चाहिए। विविधताएं अधिक अनुरोधों को संभालने, विलंबता को कम करने और इतने पर सक्षम होने के लिए मूल रूप से अनुकूलन हैं; मूल अवधारणा वही है।

डब्लूएसजीआई केवल पायथन है। एक भाषा नास्तिक प्रोटोकॉल के बजाय, एक मानक समारोह हस्ताक्षर परिभाषित किया गया है:

def simple_app(environ, start_response): 
    """Simplest possible application object""" 
    status = '200 OK' 
    response_headers = [('Content-type','text/plain')] 
    start_response(status, response_headers) 
    return ['Hello world!\n'] 

एक पूर्ण (यदि सीमित) WSGI अनुप्रयोग है कि। WSGI समर्थन वाला एक वेब सर्वर (जैसे mod_wsgi के साथ अपाचे) जब भी कोई अनुरोध आता है तो इस फ़ंक्शन को आवेदक कर सकता है।

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

यह वेब सर्वर के पीछे चलने वाले लंबे समय तक चलने वाले ढांचे को भी आसान बनाता है, अगर अनुरोध के लिए किए जाने वाले सभी को एक फ़ंक्शन कॉल है। सादा सीजीआई के साथ, आपको प्रत्येक व्यक्तिगत अनुरोध के लिए start your whole framework up करना होगा।

डब्लूएसजीआई समर्थन के लिए, आपको एक डब्लूएसजीआई मॉड्यूल स्थापित करना होगा (जैसे mod_wsgi), या डब्लूएसजीआई के साथ एक वेब सर्वर का उपयोग करें (जैसे CherryPy)। यदि उनमें से कोई भी संभव नहीं है, तो आप पीईपी में दिए गए CGI-WSGI पुल का उपयोग कर सकते हैं।

+2

डब्ल्यूएसजीआई भाषा अज्ञेयवादी नहीं बनाने के लिए किसके बेवकूफ विचार थे? तब क्या बात है? साथ ही पूरे पाइथन को अपाचे मॉड्यूल के रूप में भी भेज सकते हैं। –

+2

@ सलमान पीके मुझे लगता है कि यह सिर्फ एक व्यापार बंद है। निश्चित रूप से यह एक भाषा-अज्ञेय प्रोटोकॉल बनाने के लिए आसान नहीं है (यदि असंभव नहीं है) जिसे चयनित भाषा में फ़ंक्शन को कार्यान्वित करके उपयोग किया जा सकता है। – phunehehe

4

यह पाइथन के लिए एक साधारण अमूर्त परत है, जो सर्वलेट स्पेक जावा के लिए है। जबकि सीजीआई वास्तव में निम्न स्तर है और केवल प्रक्रिया पर्यावरण और मानक में/बाहर मानक में डंप करता है, उपर्युक्त दो चश्मा http अनुरोध और भाषा में संरचना के रूप में प्रतिक्रिया मॉडल करते हैं। मेरी धारणा हालांकि यह है कि पाइथन लोगों में डी-फैक्टो कार्यान्वयन पर काफी समाधान नहीं हुआ है, इसलिए आपके पास संदर्भ कार्यान्वयन का मिश्रण है, और अन्य उपयोगिता-प्रकार पुस्तकालय जो अन्य चीजें WSGI समर्थन (उदा। पेस्ट) के साथ प्रदान करते हैं। बेशक मैं गलत हो सकता था, मैं पाइथन के लिए एक नवागंतुक हूँ। जावा वेब की तुलना में "वेब स्क्रिप्टिंग" समुदाय एक अलग दिशा (साझा होस्टिंग, सीजीआई विरासत, विशेषाधिकार अलगाव चिंताओं) से समस्या पर आ रहा है (प्रारंभिक संकलित और तैनात के खिलाफ समर्पित वातावरण में एक एंटरप्राइज़ कंटेनर चला रहा है कोड)।

6

आप इस क्षेत्र में सभी शर्तों पर स्पष्ट नहीं कर रहे हैं, और यह का सामना करने देता है, तो इसका एक भ्रामक परिवर्णी शब्द से लदी एक, वहाँ भी एक है यह देखने के एक आधिकारिक पायथन हाउटो के रूप में अच्छी पृष्ठभूमि पाठक जो सीजीआई बनाम फास्टसीजीआई बनाम डब्लूएसजीआई पर चर्चा करता है और इस तरह: http://docs.python.org/howto/webservers.html

+0

यूआरएल पुराना है, मुझे लगता है कि यह एक अपडेट किया गया है: https://docs.python.org/2.7/howto/webservers.html – Stefaan

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