web-dev-qa-db-fra.com

Où WSGIPythonPath doit-il pointer dans mon virtualenv?

J'ai un dossier appelé python2.7 à l'intérieur de lib dans l'environnement virtuel.

Après avoir lu une demi-douzaine de didacticiels, je n'arrive pas à comprendre exactement vers quoi je suis censé pointer WSGIPythonPath. J'ai vu certains pointer vers site-packages mais certains ont été deux points : liste séparée.

Syntax error on line 1019 of /etc/httpd/conf/httpd.conf:
WSGIPythonPath cannot occur within <VirtualHost> section

Où WSGIPythonPath doit-il pointer dans mon virtualenv?

19
user83039

Vous obtenez l'erreur car WSGIPythonPath La directive ne peut pas être utilisée dans le contexte VirtualHost. Vous devez le déclarer dans votre fichier de configuration Apache principal. Si vous souhaitez toujours pointer vers les répertoires de votre virtualenv dans le contexte VirtualHost, utilisez plutôt la directive WSGIDaemonProcess, il a une option python-path pour vous de déclarer votre _ [pythonpertinent _ répertoires.

Par exemple: votre fichier de configuration d'hôte virtuel devrait ressembler à ceci:

<VirtualHost *:80>
ServerName example.com
CustomLog logs/example.com-access_log common
ErrorLog logs/example.com-error_log

WSGIDaemonProcess example.com python-path=/virtualenvpathto/site-packages:/pathto/exampleprojecthome
WSGIProcessGroup example.com

...
</VirtualHost>

Le signe deux-points complet : est utilisé lorsque vous avez plusieurs répertoires python que vous souhaitez ajouter à la variable d'environnement $ PYTHON_PATH de façon à dire import example.foo fonctionne bien. Dans l'exemple ci-dessus, il existe deux répertoires, ils peuvent être plus ou moins selon la façon dont vous avez configuré votre projet.

Si vous êtes sous Windows, utilisez le point-virgule; au lieu de deux points pleins.

J'espère que ça aide.

19
kaykae

tl; dr: utilisez WSGIDaemonProcess python-home=…. Les alternatives utilisant WSGIPythonPath ou WSGIDaemonProcess python-path=… (avec -path au lieu de -home!) ne sont plus recommandés.

L'ancien et le nouveau

Comme mentionné par @kaykae, WSGIPythonPath ne peut pas être utilisé dans un contexte VirtualHost mais WSGIDaemonProcess python-path=… est l'équivalent. Cependant, même si cela peut encore fonctionner, ce n'est plus la méthode recommandée pour configurer Apache mod_wsgi avec des environnements virtuels Python:

Notez que la pratique antérieure était que ces façons de définir le chemin de recherche du module Python [à savoir WSGIDaemonProcess …python-path=… et WSGIPythonPath] ont été utilisés pour spécifier l'emplacement de l'environnement virtuel Python. Plus précisément, ils ont été utilisés pour ajouter le site-packages directory de l'environnement virtuel Python. Vous ne devriez pas faire cela.

La meilleure façon de spécifier l'emplacement de l'environnement virtuel Python est d'utiliser le python-home option de la directive WSGIDaemonProcess pour le mode démon, ou de la directive WSGIPythonHome pour le mode embarqué. Ces façons de spécifier l'environnement Python virtuel sont disponibles depuis mod_wsgi 3.0 et les distributions Linux n'ont pas livré une telle ancienne version de mod_wsgi depuis un certain temps. Si vous utilisez l'ancienne méthode, veuillez mettre à jour vos configurations.

(Source: Documents WSGI: Guides de l'utilisateur: Environnements virtuels )

Comment faire la nouvelle façon

Le fait que vous essayez de configurer mod_wsgi dans un contexte VirtualHost montre que vous utilisez la version de configuration "mode démon". Selon la citation ci-dessus, la façon recommandée d'inclure votre environnement virtualenv dans votre chemin Python serait alors une section comme celle-ci dans votre section VirtualHost (bien que il peut également être défini à l'extérieur, car il peut être référencé avec le myapp1 identifiant du groupe de processus faemon que vous choisissez):

<IfModule mod_wsgi.c>
  WSGIDaemonProcess myapp1 user=user1 group=group1 threads=5 
python-home=/path/to/project/venv
</IfModule>

Notez que /path/to/project/venv est le chemin de base de votre environnement virtualenv. Ce serait un sous-répertoire venv dans le répertoire où vous avez appelé virtualenv venv pour le créer.

Notez également que vous pouvez ajouter d'autres chemins à votre Python pour que vos instructions import fonctionnent pour les packages non gérés via PIP ou similaire. Par exemple, vous pouvez ajouter python-path=/path/to/project. N'utilisez simplement pas ce mécanisme pour informer wsgi de toute la configuration de virtualenv - pour cela, ils ont introduit python-home.

4
tanius