पायथन वेब फ्रेमवर्क, डब्ल्यूएसजीआई और सीजीआई एक साथ कैसे फिट होते हैं


150

मेरे पास एक Bluehost खाता है जहाँ मैं CGI के रूप में पायथन स्क्रिप्ट चला सकता हूँ। मुझे लगता है कि यह सबसे सरल CGI है, क्योंकि चलाने के लिए मुझे निम्नलिखित को परिभाषित करना होगा .htaccess:

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

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

WSGI , CGI, और चौखटे कैसे जुड़े हुए हैं? क्या मुझे पता है, स्थापित करने की जरूरत है, और अगर मैं एक वेब रूपरेखा (माना चलाना चाहते हैं क्या करते हो web.py या CherryPy मेरी बुनियादी सीजीआई विन्यास पर)? WSGI समर्थन कैसे स्थापित करें?

जवाबों:


242

WSGI, CGI, और चौखटे कैसे जुड़े हुए हैं?

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

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

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

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

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

यदि मुझे अपने मूल सीजीआर कॉन्फ़िगरेशन पर वेब फ्रेमवर्क (वेबकेम या चेरीफी) कहना हो तो मुझे क्या जानना / स्थापित करना / करना होगा?

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

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

  2. डेमॉन mod_wsgi या mod_fastcgiअपाचे को WSGI प्रोटोकॉल का उपयोग करके एक अलग डेमॉन (या "लंबी चलने वाली प्रक्रिया") के साथ बातचीत करने की अनुमति देता है। आप अपनी लंबी चलने वाली Django प्रक्रिया शुरू करते हैं, फिर आप इस प्रक्रिया के साथ संचार करने के लिए Apache की 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


4
मैं mod_wsgi स्थापित नहीं कर सकता क्योंकि मैं साझा होस्टिंग पर हूँ। मेरे पास fcgi का समर्थन है। मैं अभी भी इसके माध्यम से WSGI ऐप कैसे चला सकता हूं?
एली बेंडरस्की

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

14
S.Lott, शिकायत करने के बजाय जब लोग पूछते हैं कि "बेहतर" है, तो बस राज्य क्यों नहीं "mod_wsgi एक्स के रूप में बेहतर है, Fastcgi वाई के लिए बेहतर है", और अगर ओपी के पास अधिक विशिष्ट प्रश्न हैं, तो वे पूछेंगे।
ग्रीग लिंड

7
@Greg लिंड: क्यों नहीं बस राज्य "mod_wsgi एक्स के रूप में बेहतर है, Fastcgi वाई के लिए बेहतर है"? क्योंकि यह करना बहुत आसान नहीं है। दर्जनों गैर-कार्यात्मक गुणवत्ता कारक हैं जो एक्स और वाई सेट के तत्व हैं। उन सभी को घेरना मुश्किल है। यह उन लोगों के लिए कहीं अधिक बेहतर है, जो प्रासंगिक कारकों के बारे में विशिष्ट प्रश्न पूछते हैं।
S.Lott

4
बस नोटों के लिए: संस्करण 1.7 के बाद से रनफैगी विकल्प को हटा दिया गया है और Django 1.9 में FastCGI समर्थन को हटा दिया गया था।
OBu

58

मुझे लगता है कि फ्लोरियन का जवाब "डब्ल्यूएसजीआई क्या है" के बारे में आपके प्रश्न का हिस्सा है, खासकर यदि आप पीईपी पढ़ते हैं

प्रश्नों के लिए आप अंत की ओर मुद्रा करें:

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

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

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

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 के साथ Apache) के साथ एक वेब सर्वर जब भी कोई अनुरोध आता है, तो इस फ़ंक्शन को लागू कर सकता है।

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

वेब सर्वर के पीछे लंबे समय तक चलने वाली रूपरेखाओं को चलाना भी बहुत आसान हो जाता है, अगर एक अनुरोध के लिए जो कुछ भी करना है वह एक फ़ंक्शन कॉल है। सादे CGI के साथ, आपको प्रत्येक व्यक्ति के अनुरोध के लिए अपना पूरा ढांचा शुरू करना होगा ।

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


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

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

21

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

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

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

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


3
क्या सीजीआई के ऊपर WSGI चल रहा है "flup" किसके लिए है? फ्लॉप योजना से कैसे जुड़ा है?
एली बेंडरस्की

7

यदि आप इस स्थान की सभी शर्तों के बारे में अस्पष्ट हैं, और इसका सामना कर रहे हैं, तो यह एक भ्रामक संक्षिप्त रूप से भरा हुआ है, एक आधिकारिक अजगर HOWTO के रूप में एक अच्छी पृष्ठभूमि पाठक भी है जो CGI बनाम FastCGI बनाम WSGI और इतने पर चर्चा करता है। on: http://docs.python.org/howto/webservers.html


2
यूआरएल पुरानी है, मुझे लगता है कि यह अद्यतन किया जाता है एक: docs.python.org/2.7/howto/webservers.html
Stefaan

महान सामग्री :) किसी को इस आधिकारिक परिचय को स्वीकृत उत्तर के साथ पढ़ना चाहिए।
रिक

4

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.