Flask Приложение использует неправильный Python интерпретатор - необходимо знать, как "скомпилировать" mod_wsgi для работы с указанной c Python версией - PullRequest
0 голосов
/ 20 января 2020

TL; DR , мне нужно знать, как "скомпилировать" файл WSGI таким образом, чтобы он использовал интерпретатор Python, отличный от того, который я изначально установил mod_wsgi.

Это мое первое Flask приложение / веб-сайт, так что, надеюсь, вы можете простить немного невежества. Я постараюсь дать вам соответствующую информацию.

У меня есть приложение Flask, работающее на сервере Ubuntu через Nginx / Apache (обратная настройка прокси). Моя структура папок выглядит следующим образом:

|----MyApp
|------MyApp.wsgi
|------MyApp
|--------__init__.py
|--------templates
|--------static
|--------requirements.txt
|--------venv

Я получаю странные исключения из моего приложения и обнаружил, что мое приложение Flask работает с неверной версией интерпретатора Python, таким образом, часть кода не работает, как ожидалось. У меня установлен pyenv, и Python 3.8.1 установлен как глобальный, но когда приложение запускается через Apache, оно использует Python 2.7.17 (версия, которая поставляется с Ubuntu 18.04). Я выяснил хотя бы часть проблемы. Я следовал этому уроку: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps

В какой-то момент у вас есть учебник по sudo pip install Flask, который, кажется, устанавливает Flask «глобально» (т. Е. Вне вену, который, кажется, победить цель). Не уверен, что я использую правильную терминологию. Итак, я делал:

python3 -m venv venv
source venv/bin/activate
sudo pip install Flask

Затем, когда я запускал свое приложение, либо через Apache, либо даже просто из окна терминала, я печатал в файл .txt sys.version Таким образом, я мог видеть интерпретатор Python, который он использовал, и вуаля, он использует 2.7.17, а не 3.8.1. Таким образом, методом проб и ошибок я узнал, что sudo pip install Flask не то, что я хотел. pip install Flask (при запуске с активированным venv) дает желаемый результат при запуске приложения Flask из терминала:

source venv/bin/activate
export FLASK_APP=__init__.py
flask run

И BAM, я получаю правильную версию Python, 3.8.1. Однако теперь у меня возникла новая проблема. Когда я перезагружаю Apache и пытаюсь go перейти на мой сайт, Apache выдает следующую ошибку: Exception occurred processing WSGI script '/var/www/MyApp/MyApp.wsgi' и ImportError: No module named flask

Я думаю, что мне нужно сказать Apache или WSGI (или кто бы ни) где моя Flask установка, так как она установлена ​​только в пределах venv. Я нашел это сообщение SO: Flask - WSGI - Нет модуля с именем 'flask'

И попробовал предлагаемое решение, используя директиву python-path в моей конфигурации Apache, например: Итак:

  WSGIScriptAlias / /var/www/MyApp/MyApp.wsgi
  # WSGIDaemonProcess MyApp python-home=/var/www/MyApp/MyApp/venv
  WSGIDaemonProcess MyApp python-path=/var/www/MyApp:/var/www/MyApp/MyApp/venv/lib/python3.8/site-packages
  WSGIProcessGroup MyApp

И БАМ, мое приложение снова работает, но ЭЙ, почему оно все еще использует Python 2.7.17? Я перешел по ссылке, которую опубликовал один из комментаторов, относительно использования виртуальных сред с WSGI: https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

Из того, что я собрал, я должен был установить mod_wsgi перед установкой pyenv и Python 3.8.1. Таким образом, mod_wsgi «скомпилирован» со старой версией Python, и вы не можете использовать виртуальную среду, чтобы заставить mod_wsgi использовать версию python, отличную от той, с которой он был установлен / скомпилирован. Как переустановить и скомпилировать mod_wsgi, чтобы он работал на моей любимой Python версии?

Редактировать: Я пытался сделать

sudo apt-get --purge remove libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi-py3

Однако теперь мой приложение использует Python 3.6.9 (системная версия, которая шла с Ubuntu 18.04). Похоже, этот метод установки игнорирует мои настройки pyenv (Python 3.8.1). Могу ли я переопределить это и указать версию python как-нибудь?

1 Ответ

0 голосов
/ 21 января 2020

После долгих поисков, проб и ошибок и ненависти к себе, я понял это. Я пробовал много разных способов установки mod_wsgi, которые не работали. Я обнаружил пост StackOverflow, в котором рассказывалось о том, что мне мешало, что я не установил python 3.8.1 с использованием pyenv с установленным параметром общих библиотек: Запустите mod_wsgi с pyenv

Итак, я сделал:

pyenv uninstall 3.8.1
CONFIGURE_OPTS=--enable-shared pyenv install 3.8.1

Затем я смог активировать свою виртуальную среду и локально установить mod_wsgi в свое приложение.

rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install Flask
pip install mod_wsgi

Затем я получил apache сказать, какой файл wsgi использовать. К счастью, есть команда, которую вы можете запустить, чтобы показать, что сказать Apache:

mod_wsgi-express module-config

, которая выводит что-то вроде этого:

LoadModule wsgi_module "/var/www/MyApp/MyApp/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
WSGIPythonHome "/var/www/MyApp/MyApp/venv"

И я добавил это в файл: /etc/apache2/mods-available/wsgi.load

Перезагрузите apache и ШАЗАМ! Мое приложение / веб-сайт работает на Python 3.8.1!

...