2015-06-04 11 views
7

का उपयोग करने के लिए फ्लास्क प्राप्त करना मुझे मूलभूत "हैलो वर्ल्ड" फ्लास्क ऐप चल रहा है।पाइथन 3 (अपाचे/mod_wsgi)

मैं अपाचे 2.4 का उपयोग कर उबंटू 14.04 पर हूं। मैंने mod_wsgi स्थापित किया है।

मैंने वर्चुअलनव-निर्मित पायथन 2 को फ्लास्क स्थापित करने के लिए ~/web/piFlask/venv/ बनाया है।

हालांकि, मैं अपने फ्लास्कैप को एक पायथन 3.x मॉड्यूल आयात करना चाहता हूं जो मैंने लिखा है।

ऐसा करने के लिए मुझे क्या करने की ज़रूरत है?

मैं एक ~/web/piFlask/venv3/ बनाने और ~/web/piFlask/piFlask.wsgi को संशोधित करने की कोशिश की:

import os, sys 

PROJECT_DIR = '/home/pi/web/piFlask' 

activate_this = os.path.join(PROJECT_DIR, 'venv3/bin', 'activate_this.py') 
execfile(activate_this, dict(__file__=activate_this)) 
sys.path.insert(0, PROJECT_DIR) 

from piFlask import app as application 

application.debug = True 

लेकिन मुझे नहीं लगता कि यह पर्याप्त है। यह .wsgi वास्तव में एक पायथन फ़ाइल है जो mod_wsgi द्वारा निष्पादित की जाएगी, जो मुझे यकीन है कि निष्पादन करने के लिए मुझे Py2.x दुभाषिया का उपयोग करना होगा।

तो अगर मैं सही ढंग से समझ रहा हूं, तो mod_wsgi इस .wsgi को निष्पादित करने के लिए सिस्टम पायथन को सक्रिय करता है, जो बदले में अनुरोध को संसाधित करने के लिए मेरे ~/web/piFlask/venv/ दुभाषिया को आग लग जाएगा।

मुझे लगता है मैं /etc/apache2/mods-available/wsgi.conf

में WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages की स्थापना करके या तो एक प्रणाली python3 या अपने खुद के venv3/... उपयोग करने के लिए mod_wsgi लिए राजी कर सकता है लेकिन मैं कहीं एक निर्देश मिला कह रही है कि आपको Py3 के लिए mod_wsgi संकलित करना है, और नीचे इस समस्या से नीचे जल्दी गिर जाता है।

उत्तर

6

सही, mod_wsgi को एक विशिष्ट पायथन संस्करण के लिए संकलित करने की आवश्यकता है क्योंकि यह वास्तव में 'पायथन' निष्पादन योग्य नहीं होता है। इसके बजाय पाइथन पुस्तकालय mod_wsgi में जुड़ा हुआ है।

अंतिम परिणाम यह है कि आप पाइथन 2 दुभाषिया का उपयोग कर चल रहे किसी एप्लिकेशन के भीतर पायथन 3 कोड को मिश्रित नहीं कर सकते हैं।

आपको अपने कोड को पायथन 2 और 3 दोनों के तहत चलाने योग्य बनाने पर विचार करना होगा और फिर आप उन लोगों में से चुन सकते हैं जिन्हें आप उपयोग करना चाहते हैं और आपके द्वारा उपयोग किए जाने वाले संस्करण के लिए संकलित mod_wsgi के संस्करण का उपयोग करें।

+0

मैं सिर्फ python3 को लक्षित करने के लिए जा रहा हूँ। ऐसा लगता है कि 'libapache2-mod-wsgi-py3' है - क्या मैं इसके बजाय कर सकता हूं: 1. a2disable mod_wsgi, 2. पाइप का उपयोग कर mod_wsgi अनइंस्टॉल करें, 3. pip3 का उपयोग करके libapache2-mod-wsgi-py3 स्थापित करें? –

+1

हां। जब तक आपके सभी कोड और किसी तीसरे पक्ष के पाइथन मॉड्यूल की आवश्यकता है, तो पाइथन 3 सक्षम है। सब कुछ आपके पायथन 3 वर्चुअल वातावरण में स्थापित करने की आवश्यकता होगी। आप विभिन्न पायथन संस्करणों के लिए वर्चुअल वातावरण से भागों को मिश्रित नहीं कर सकते हैं। –

9

मुझे थोड़ी देर लग गई, हालांकि यह अंत में वास्तव में सरल थी। दुर्भाग्य से मैंने अपना बैश इतिहास खो दिया है, इसलिए यदि आपको कोई गलती मिलती है, तो कृपया एक टिप्पणी छोड़ दें या सुधार में संपादित करें।

ध्यान दें कि मैं पहले से ही mod_wsgi काम कर रहे है, तो मैं इसे हटाने के लिए था:

$ a2dismod wsgi 
$ sudo apt-get remove libapache2-mod-wsgi 

संपादित करें: कारण एक पुराने पैकेज (जो अपाचे के त्रुटि लॉग में धीरे-धीरे एक छोटी सी त्रुटि में परिणाम apt-मिल स्थापित करने इसके बजाय

$ sudo apt-get install libapache2-mod-wsgi-py3 
$ a2enmod wsgi 

, पहले अपने py3 आभासी वातावरण की स्थापना की, (और साथ ही में इसे में बोतल स्थापित हो सकता है जब आप इसे पर हैं)

012,337:) मैं नहीं लेखन के समय इस की सिफारिश करते हैं

अब इस venv में mod_wsgi स्थापित करने के लिए Installing mod_wsgi for Python3 on Ubuntu का पालन करें, और ...

$ deactivate      # ... & exit 

यह मूल दृष्टिकोण apt-get से था, अब यह प्रासंगिक नहीं है:

अब मैं mod_wsgi उपयोग इस नए Py3 करना है:

$ sudo nano /etc/apache2/mods-enabled/wsgi.conf 

और कार्य करें:

#WSGIPythonPath directory|directory-1:directory-2:... 
WSGIPythonPath /home/pi/web/flaskapp/venv3/lib/python3.4/site-packages 

अंत में मैं अपने ~/वेब/flaskapp/flaskapp.wsgi संशोधित करने के लिए इतना है कि यह अब python3 का समर्थन करता है की जरूरत है:

$ cat web/piFlask/piFlask.wsgi 

# http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/#creating-a-wsgi-file 
# http://www.enigmeta.com/2012/08/16/starting-flask/ 

# for Py3: 
# http://askubuntu.com/questions/488529/pyvenv-3-4-error-returned-non-zero-exit-status-1 

import os, sys 

PROJECT_DIR = '/home/pi/web/flaskapp' 
sys.path.insert(0, PROJECT_DIR) 


def execfile(filename): 
    globals = dict(__file__ = filename) 
    exec(open(filename).read(), globals) 

activate_this = os.path.join(PROJECT_DIR, 'venv3/bin', 'activate_this.py') 
execfile(activate_this) 


from piFlask import app as application 
application.debug = True 

कितना अपाचे mod_wsgi उपयोग करता है जब उपयोगकर्ता http://myfoo.org/flask करने के लिए अपने ब्राउज़र बताते हैं इस फाइल को निष्पादित करने के लिए का एक चेतावनी :

$ cat /etc/apache2/sites-available/000-default.conf 
: 
WSGIDaemonProcess flaskProcess user=pi group=pi threads=5 
WSGIScriptAlias /flask /home/pi/web/flaskapp/flaskapp.wsgi 

<Location /flask> 
    WSGIProcessGroup flaskProcess 
    WSGIApplicationGroup %{GLOBAL} 
    Require all granted 
</Location> 
: 

चर्चा: यह थोड़ा गंदा है कि मैं अपाचे में mod_wsgi मॉड्यूल स्थापित करने हूँ लगता है, लेकिन यह एक venv3 जो मेरे flaskapp फ़ोल्डर के अंदर है में रहता है। लेकिन यह कम से कम अपाचे -> mod_wsgi -> (सही i.e. venv3 पायथन का उपयोग करता है) -> {मेरा FlaskApp लॉन्च करने के लिए} सुनिश्चित करता है।

वैकल्पिक विकल्प सिस्टम पायथन को अपडेट करना होगा, और वेनव के बजाय इसका उपयोग करना होगा।

+0

इसके लिए आपको बहुत बहुत धन्यवाद। मैंने पाइथन 3 पर mod_wsgi चलाने के लिए एक रास्ता खोजने का प्रयास करने में कई घंटे बिताए। मुझे क्या पता नहीं था कि पाइथन 3 के लिए एक विशिष्ट संस्करण है। – Cyrusville

1

मैंने उबंटू 16.04 (आभासी मशीन) पर एक venv में फ्लास्क 0.12 के साथ python3.5.2 चलाने शुरू कर दिया।

@ ग्राहम ने डब्लूएसजीआई स्क्रिप्ट फ़ाइल से वेनव को सक्रिय करने की ओर इशारा किया, पसंदीदा तरीका नहीं है। अधिक यहाँ जानकारी: http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

बस इस पर जानकारी की तलाश में मैं अपने सभी कदम एक साथ डाल रहा हूं किसी और के लिए:
नोट: मेरे ऐप नाम प्रज्वलन है, पथ ~/जनवरी/प्रज्वलन। उन्हें अपने साथ बदलें।

sudo apt install python3-pip 

sudo apt-get install python3-venv 
python3 -m venv ~/blazing/venv 
source /home/jan/blazing/venv/bin/activate 

pip3 install --upgrade pip  
pip3 install Flask 

sudo apt-get install apache2-dev 
(venv) pip3 install mod_wsgi 
(venv) sudo venv3/bin/mod_wsgi-express install-module 

उत्पादन:
LoadModule wsgi_module "" /usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so "
WSGIPythonHome/घर/जनवरी/प्रज्वलन/venv "

sudo vim /etc/apache2/mods-available/wsgi_express.load 

जोड़ें: LoadModule wsgi_module" /usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu।इसलिए "

sudo vim /etc/apache2/mods-available/wsgi_express.conf 

जोड़ें:

WSGIPythonHome "/home/jan/blazing/venv" 
WSGIPythonPath /home/jan/blazing/venv/lib/python3.x/site-packages 

तो

sudo a2enmod wsgi_express 

vim /home/jan/blazing/project/flaskapp.wsgi 

जोड़ें:

import os, sys 

PROJECT_DIR = '/home/jan/blazing' sys.path.insert(0, PROJECT_DIR) 

activate_this = os.path.join(PROJECT_DIR, 'venv/bin', 'activate_this.py') 
with open(activate_this) as file_: 
    exec(file_.read(), dict(__file__=activate_this) 


from piFlask import app as application application.debug = True 

और

vim /etc/apache2/sites-available/flask.conf 

जोड़ें:

WSGIDaemonProcess flaskProcess user=www-data group=www-data threads=5 
WSGIScriptAlias /flask /home/jan/blazing/project/flaskapp.wsgi 

ErrorLog ${APACHE_LOG_DIR}/error_flask.log #you can see the errors here.. 
CustomLog ${APACHE_LOG_DIR}/access_flask.log combined 

<Location /flask> 
    WSGIProcessGroup flaskProcess 
    WSGIApplicationGroup %{GLOBAL} 
    Require all granted 
</Location> 

या यदि आप अन्य साइटों चल रहा है और आभासी मेजबानों में से एक के रूप में कुप्पी करना चाहते हैं, तो आप इस conf फ़ाइल का उपयोग कर सकते हैं:

<VirtualHost *> 
    ServerName flask.ubuntuws 
    ErrorLog ${APACHE_LOG_DIR}/error_flask.log 
    CustomLog ${APACHE_LOG_DIR}/access_flask.log combined 

    WSGIDaemonProcess flaskProcess user=www-data group=www-data threads=5 
    WSGIScriptAlias//home/jan/blazing/project/flaskapp.wsgi 

    <Location /> 
     WSGIProcessGroup flaskProcess 
     WSGIApplicationGroup %{GLOBAL} 
     Require all granted 
    </Location> 
</VirtualHost> 

और सुनिश्चित करें कि आपके PROJECT_DIRflaskapp.wsgi में PROJECT_NAME .py।
आभासी साइट सक्षम और अपाचे पुनः लोड:

अंत में:

sudo a2ensite flask.conf 
sudo service apache2 reload 
+0

पर अंगूठे सुझाव दें कि आप http://modwsgi.readthedocs.io/en/develop पढ़ें वर्चुअल वातावरण का उपयोग करने के पसंदीदा तरीके के लिए /user-guides/virtual-environments.html। इसे WSGI स्क्रिप्ट फ़ाइल से सक्रिय करना पसंदीदा तरीका नहीं है। आपको "WSGIRestrictStdout ऑफ' 'की भी आवश्यकता नहीं है क्योंकि यह डिफ़ॉल्ट है। –

+0

लिंक के लिए धन्यवाद, मेरी पोस्ट अपडेट की गई। – cristian

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