2012-03-13 6 views
14

मुझे अपना अपाचे सर्वर सेटअप मिला है और यह mod_wsgi के माध्यम से फ्लास्क प्रतिक्रियाओं को संभाला जा रहा है। मैं अन्य नाम के माध्यम WSGI स्क्रिप्ट पंजीकृत कर लिया है:मैं अपाचे और mod_wsgi के साथ फ्लास्क मार्गों का उपयोग कैसे करूं?

[httpd.conf]

WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi" 

मैं ऊपर पथ पर इसी WSGI फ़ाइल जोड़ी है:

[/ MNT/www/WSGI-scripts/service.wsgi]

import sys 
sys.path.insert(0, "/mnt/www/wsgi-scripts") 

from service import application 

और मैं एक साधारण परीक्षण बोतल Python स्क्रिप्ट है जो सेवा मॉड्यूल प्रदान करता है:

[/mnt/www/wsgi-scripts/service.py]

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def application(environ, start_response): 
     status = '200 OK' 
     output = "Hello World!" 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

@app.route('/upload') 
def upload(environ, start_response): 
     output = "Uploading" 
     status = '200 OK' 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

if __name__ == '__main__': 
     app.run() 

जब मैं अपने वेबसाइट यूआरएल [होस्ट नाम]/सेवा यह काम करता है की उम्मीद है और मैं के रूप में करने के लिए जाना "नमस्ते दुनिया!" वापस। समस्या यह है कि मुझे नहीं पता कि उपरोक्त उदाहरण में 'अपलोड' जैसे काम करने के लिए अन्य मार्ग कैसे प्राप्त करें। यह स्टैंडअलोन फ्लास्क में ठीक काम करता है लेकिन mod_wsgi के तहत मैं स्टंप हो गया हूं। एकमात्र चीज जिसे मैं कल्पना कर सकता हूं, मैं प्रत्येक एंडपॉइंट के लिए httpd.conf में एक अलग WSGI स्क्रिप्ट उपनाम पंजीकृत कर रहा हूं, लेकिन यह फ्लास्क के फैंसी रूटिंग समर्थन को दूर ले जाता है। क्या यह काम करने का कोई तरीका है?

+3

आप '/ सेवा/upload' के लिए ब्राउज़ करने की कोशिश की है? आपको सुखद आश्चर्य हो सकता है। –

+0

जब मैं अनुरोध/सेवा/अनुरोध अपलोड करता हूं तब भी 'एप्लिकेशन' फ़ंक्शन पर भेजा जाता है। वास्तव में, मैं एप्लिकेशन फ़ंक्शन से पहले रूट स्टेटमेंट को हटा सकता हूं और यह अभी भी काम करता है। यह एप्लिकेशन की प्रविष्टि बिंदु के रूप में हमेशा mod_wsgi द्वारा एप्लिकेशन का उपयोग किया जा रहा है। ऐसा लगता है कि मुझे 'एप्लिकेशन' के अंदर कुछ करने की ज़रूरत है जो फ्लास्क के रूटिंग तर्क को बंद कर देता है। –

उत्तर

17

अपनी wsgi फ़ाइल में आप from service import application कर रहे हैं, जो केवल आपकी application विधि आयात कर रहा है।

बदलें कि from service import app as application और सब कुछ करने की उम्मीद के रूप में काम करेंगे।

अपनी टिप्पणी के बाद, मैंने सोचा कि मैं इस सवाल का जवाब एक सा विस्तार चाहते हैं:

आपका WSGI फ़ाइल अजगर कोड है - आप इस फाइल के अंदर किसी वैध अजगर कोड हो सकता है। WSGI "हैंडलर" कि अपाचे में स्थापित किया गया है इस फ़ाइल में आवेदन नाम है, जो यह करने के लिए अनुरोध बंद हाथ होगा की तलाश में है। एक फ्लास्क वर्ग उदाहरण - app = Flask(__name__) - इस तरह के एक इंटरफेस प्रदान करता है, लेकिन इसके बाद से app और नहीं application कहा जाता है, तो आप इसे अन्य नाम पर जब आप इसे आयात है - कि क्या लाइन से करता है।

आप कर सकते हैं - और यह बिल्कुल ठीक है - बस यह application = Flask(__name__) करें और फिर अपाचे में wsgi हैंडलर को service.py फ़ाइल पर इंगित करें। यदि service.py आयात योग्य था (इसका मतलब है, कहीं PYTHONPATH में), तो आपको मध्यस्थ wsgi स्क्रिप्ट की आवश्यकता नहीं होगी।

हालांकि उपरोक्त काम करता है, अपने खराब व्यवहार का। Wsgi फ़ाइल को अपाचे प्रक्रिया से काम करने की अनुमति की आवश्यकता होती है; और आप आम तौर पर उस वास्तविक स्रोत कोड से अलग करते हैं जो उचित फाइलों के साथ आपके फाइल सिस्टम पर कहीं और होना चाहिए।

+0

जिसने चाल बनाई थी। धन्यवाद! आपके द्वारा इंगित किए गए मिलान से मेल खाने के लिए service.wsgi को बदलने के अलावा, मुझे शुद्ध फ्लास्क होने के लिए मेरी service.py को वापस करने की भी आवश्यकता है। मूल समस्या कथन में मुझे लगता है कि मैं फ्लास्क के साथ शुद्ध mod_wsgi कोड मिश्रण रेलों को प्राप्त कर दूंगा।मुझे लगता है कि इस भ्रम की उत्पत्ति मेरे रूट रूट हैंडलर 'एप्लिकेशन' का नाम दे रही थी। –

+1

मुझे लगता है कि मैं mod_wsgi बनाम फ्लास्क कोड के बारे में अस्पष्ट था। मैं समझता हूं कि यह सब पाइथन है। मैं जो अटक रहा था वह यह है कि मेरे '@ app.route ('/') के ऊपर उदाहरण में' फ़ंक्शन 'एप्लिकेशन को सजाया जा रहा है। मेरे मूल सेटअप में मैं सिर्फ आवेदन आयात कर रहा था इसलिए केवल उस समारोह को बुलाया जा रहा था। जब मैंने _service.wsgi_ को 'सेवा आयात ऐप से एप्लिकेशन' के रूप में उपयोग करने के लिए बदल दिया, जिसने फ्लास्क ऑब्जेक्ट को सही ढंग से संदर्भित किया, लेकिन ऐसा लगता है कि 'एप्लिकेशन' फ़ंक्शन के साथ नामकरण संघर्ष भी हुआ है। मैंने इस फ़ंक्शन का नाम बदलकर '@def root(): 'और अब यह ठीक काम करता है। एक बार फिर धन्यवाद! –

+0

स्वीट! यह मेरी पीड़ा का जवाब था। –

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