web-dev-qa-db-fra.com

Comment inciter Gunicorn à utiliser Python 3 au lieu de Python 2 (502 passerelle incorrecte)

J'essaie de faire en sorte que Gunicorn utilise Python3 pour une application Django que je veux créer. J'utilise l'image Django de Digital Ocean pour commencer. Django, Gunicorn et Nginx sont installés et configurés. Le projet Django par défaut fourni avec cette image semble fonctionner correctement pour Python 2.

J'ai apt-get 'ed ces paquets.

  • python3
  • python3-psycopg2
  • python3-dev
  • python3-pip

Afin d'éviter tout problème, je l'ai également fait.

  • pip désinstaller Django
  • pip3 installe Django

J'ai rm -rf 'édité le projet de stock et créé un nouveau avec Django-admin.py startproject Django_project. Django-admin.py utilise Python 3 (selon le Shebang). Plus tard, j'utilise python3 manage.py startapp Django_app pour créer une nouvelle application.

À ce stade, tout fonctionne bien. Tout comme l'application par défaut. Ensuite, dans Django_app/views.py je le fais et ça casse.

from Django.shortcuts import render
from Django.http import HttpResponse

def index(request):
    # Python 2 and 3 - works fine
    # print('PRINTING')

    # Python 3 only - crashes
    print(1, 2, end=' ')

    return HttpResponse("Hello, world! This is my first view.")

La page d'erreur indique que j'utilise Python 2.7.6.

Bon, alors je pensais pouvoir installer Gunicorn via pip pour Python 3, alors je le fais.

  • pip désinstaller gunicorn
  • pip3 installer gunicorn

Mais alors je me retrouve juste avec 502 Bad Gateway. Quand je fais service gunicorn status, je reçois gunicorn stop/waiting. J'ai essayé service gunicorn restart, mais il dit toujours gunicorn stop/waiting.

J'ai fait un which gunicorn et il est installé à /usr/local/bin/gunicorn. Euh ... je ne sais pas trop quoi d'autre je pourrais essayer. Toute aide serait grandement appréciée. Merci.

22
425nesp

C'est probablement plus facile de recommencer. Tutoriel à https://www.digitalocean.com/community/articles/how-to-install-and-configure-Django-with-postgres-nginx-and-gunicorn .

Je l'ai eu en cours d'exécution sur une gouttelette Ubuntu 14.04 fraîche. Installez python3 et Django, puis suivez simplement le tutoriel. N'a pas fait les bits postgres ou virtualenv cependant.

7
wardk

Au cas où les deux liens se briseraient un jour, voici comment je le fais fonctionner.

Commencer après avoir exécuté ces instructions.

  • pip uninstall gunicorn
  • pip3 install gunicorn

Installez supervisor, Sudo apt-get install supervisor.

Ensuite, je devais créer gunicorn_config.py à la racine du répertoire de mon projet, qui contient cela.

command = '/usr/local/bin/gunicorn'
pythonpath = '/home/Django/django_project'
bind = '127.0.0.1:9000'
workers = 3
user = 'nobody'

Ensuite, j'ai créé un fichier de configuration pour supervisor. vim /etc/supervisor/conf.d/gunicorn.conf, avec ces contenus.

[program:gunicorn]
command=/usr/local/bin/gunicorn -c /home/Django/django_project/gunicorn_config.py Django_project.wsgi
user=nobody
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn3.err.log
stdout_logfile=/var/log/gunicorn3.out.log

Après cela, j’ai fait un supervisorctl reread et un supervisorctl update puis tout a commencé à fonctionner.

Vous pouvez utiliser supervisorctl status gunicorn pour vérifier si gunicorn est en cours d'exécution ou non. Vous pouvez utiliser supervisorctl restart gunicorn pour redémarrer.

19
425nesp

ma façon:

virtualenv -p /usr/bin/python3 /home/py3env
source /home/py3env/bin/activate
pip3 install gunicorn
/home/py3env/bin/gunicorn -w4 -b0.0.0.0:8000 [projectname].wsgi
6
snow

A écrit le script suivant pour passer à Python 3.4 avec l’image 14.04 Django de DigitalOcean, car je le voulais comme configuration simple en une étape ... Il sera maintenu à l’adresse https://Gist.github.com/tr00st/190ab4de62f9b23bea69

Le principal problème avec la configuration pour moi était avec gevent, le passage à la tornade pour les travailleurs a bien fonctionné.

#!/bin/bash
# Python 3 Upgrade for Django Droplet
# Will update the "Django on 14.04" Digital Ocean image.
# Run as root.

# Grab psycopg2 and pip
apt-get install python3-pip python3-psycopg2

# Remove the Python 2.7 version of gunicorn, so we can...
pip uninstall gunicorn

# Install the Python 3 version of gunicorn, and a couple of dependencies.
pip3 install gunicorn tornado Django
# Sadly, at time of writing, gevent isn't Python 3 compatible... But tornado is!
# So, switch them out with a little sed magic
sed 's/worker_class = '\''gevent'\''/worker_class='\''tornado'\''/' /etc/gunicorn.d/gunicorn.py -i.orig

# Restart gunicorn to make the changes take effect...
service gunicorn restart

# And we're good!
5
tr00st

Il semble qu’il existe un paquet pour cela appelé gunicorn3 (cela a été testé sur Ubuntu)

Sudo apt-get install gunicorn3

puis en exécutant la commande suivante devrait fonctionner et exécuter gunicorn avec python3:

gunicorn3 --log-level debug --bind 0.0.0.0:30443 server:app

3
papadp

Pour y arriver, j'ai désinstallé gunicorn de partout:

Sudo apt-get remove gunicorn
pip uninstall gunicorn
pip3 uninstall gunicorn

Et puis Installer gunicornà partir de la source .

pip3 install git+https://github.com/benoitc/gunicorn.git

Maintenant tout fonctionne sans problème.

1
Alex Jolig

Si vous regardez l'exécutable gunicorn, il ne s'agit que d'un petit script python: 

$ cat gunicorn
#!/usr/bin/env python

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __== '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(run())

Le bit important est la ligne from gunicorn.app.wsgiapp import run, qui vous indique l'emplacement du module responsable de l'exécution de votre application. Si gunicorn est un code de qualité (quel qu'il soit), vous devriez pouvoir importer ce module directement à partir de la ligne de commande et exécuter votre application. 

"Importer le module directement à partir de la ligne de commande" signifie que vous utilisez le commutateur -m en ligne de commande

Lorsqu'il est appelé avec -m nom-module, le module donné est situé sur le chemin du module Python et exécuté en tant que script.

En utilisant le python de votre choix:

$ /path/to/your/python -m gunicorn.app.wsgiapp {{ gunicorn command line args go here }} server:app

Et bien sûr, ça coule!

[2017-12-04 02:05:27 +0000] [24] [INFO] Starting gunicorn 19.7.1
[2017-12-04 02:05:27 +0000] [24] [INFO] Listening at: http://127.0.0.1:5000 (24)
[2017-12-04 02:05:27 +0000] [24] [INFO] Using worker: sync
[2017-12-04 02:05:27 +0000] [28] [INFO] Booting worker with pid: 28
[2017-12-04 02:05:27 +0000] [29] [INFO] Booting worker with pid: 29

Ce comportement est très utile, par exemple, lorsque vous utilisez gunicorn depuis un fichier Dockerfile. 

1
bcattle

Voici comment je l'ai fait fonctionner pour moi. J'ai installé gunicorn avec pip2 et pip3. J'ai besoin des deux versions. Le défaut est gunicorn avec pip2.

Ce que j’ai fait, c’est que j’ai installé gunicorn avec virtualenv à l’aide de pip3 et jeté un coup d’œil au contenu du fichier gunicorn situé sous bin dans le dossier virtualenv.

#!/********/virtualenv/gunicorn3/corto/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __== '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(run())

J'ai copié ce fichier et l'ai mis ailleurs, puis j'ai changé 

#!/********/virtualenv/gunicorn3/corto/bin/python3

à 

#!/usr/bin/python3

Vous pouvez maintenant exécuter facilement gunicorn comme ceci après être entré dans le répertoire dans lequel vous avez copié le fichier gunicorn

python3 gunicorn -c /your_config_file.py class_app:app

Note: faire pip3 désinstaller gunicorn, puis installer pip3 install gunicorn installera gunicron avec la version python3 (en remplaçant la version python2) dans le répertoire 'usr/local/bin' (ubuntu) et vous pourrez y récupérer le contenu du fichier gunicron. Cela vous aidera à éviter d'utiliser virtualenv.

Si cela ne fonctionne pas la première fois, faites pip3 unistall gunicorn, puis pip3 installe gunicorn.

Bonne unicorn;)

0
eddys

J'ai eu le même problème sur Digital Ocean en utilisant la gouttelette "Ubuntu Django le 14.04".

J'ai réalisé que le type de travail 'gevent' était le problème pour moi lorsque j'utilisais Python 3. Même si j'ai vérifié avec python3 -m pip freeze que 'gevent' était installé, cela ne fonctionnait pas. Je l'ai changé pour 'sync' dans /etc/gunicorn.d/gunicorn.py:

...
worker_class = 'sync'
...

J'ai redémarré gunicorn:

Sudo service gunicorn restart

J'ai vérifié que le service gunicorn fonctionnait à l'aide de service gunicorn status et j'ai pu voir la page de bienvenue sur Django en accédant à l'adresse IP de mon droplet.

J'espère que cela fonctionne pour d'autres personnes.

0
Yves

Je pense que la meilleure façon de faire est d'aller dans/usr/local/bin/gunicorn et de changer la première ligne qui est la ligne Shebang en #!/Usr/bin/python-version

par exemple: mon gunicorn fonctionne avec un interpréteur python3.5

#!/usr/bin/python3.5

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __== '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(run())
0
RVndra Singh

Installer un environnement virtuel python3 dans votre dossier de projet

$ pipenv --three

Puis lancez gunicorn dans l'environnement activé

$ gunicorn [PROJECT].wgsi
0
Dexios1