Exécutez différentes versions des applications Python (wsgi) sur un environnement de développement

introduction

J'ai Python 2.7 et Django 1.4 installés dans mon environnement de développement Linux via les commandes de gestion des packages du système d'exploitation. L'application que je crée fonctionne maintenant dans cet environnement, il n'y a donc pas eu de problème.

À un moment donné, j'ai décidé de combiner Django 1.7, qui est sur le point de sortir, avec Python 3.4, pour voir quel genre de difficultés m'attend.

En bref, nous voulons parvenir à une situation où nous ne détruisons pas l'environnement de développement existant tout en menant des recherches sur des technologies de pointe dans le même environnement.

Cependant, ce "un OS, plusieurs Python et Django" est étonnamment difficile. La dernière fois que je l'ai essayé (http://qiita.com/amedama/items/79994598d9f4daa69d13), cela s'est arrêté avec le problème que je ne pouvais pas avoir plusieurs types d'Apache2 mod_wsgi.

Cette fois, comme alternative, je vais essayer de résoudre ce problème en configurant un serveur wsgi indépendant sur le même hôte et en définissant un proxy inverse depuis Apache2 en prime.

En particulier

Nous explorerons comment démarrer ces deux environnements en parallèle sur un seul environnement de développement.

En prime, j'ai rencontré des changements incompatibles dans Django 1.7, je vais donc vous les présenter également.

De plus, à la fin de l'article, je vous présenterai une vidéo de 7 minutes qui a effectivement pratiqué (une partie de) le contenu de cet article sur le terminal. Que vous souhaitiez lire l'article, regarder la vidéo ou profiter des deux, faites ce que vous voulez.

Personnages principaux

django app views.py

Cette fois, le contenu de views.py lui-même n'est pas essentiel, nous allons donc utiliser ce qui suit. Il renvoie simplement la version Python et la version django en texte brut.

views.py


from django.http import HttpResponse
import django
import sys

def home(request):
    version = ('Python: {}\nDjango: {}\n'
               .format(sys.version.replace('\n', ' '),
                       django.get_version()))
    return HttpResponse(version, content_type="text/plain")

Exécuter pour gérer.py exécuter le serveur

Ce que j'ai mis avec apt (Python 2.7 + django 1.4)

On suppose que la tornade, le django (le plus ancien), etc. sont préparés à l'avance. Je pense que vous pouvez utiliser sudo pip ou apt-get (dans Debian).

Serpentine: Avec pip, la série 1.6 sera incluse si vous ne spécifiez pas la version. Dans cet article, Debian wheezy (7.5) apt-get install python-django est le plus proche du résultat de l'article. Autant que je sache, Ubuntu 12.04 LTS contient Django 1.3 et Ubuntu 14.04 LTS contient 1.6. Le fait est que cela dépend de l'environnement. L'important est que Django 1.7 ne sera pas inclus. Pour Python 3.4, Ubuntu 14.04 LTS entrera avec apt-get.

Utiliser pleinement pyvenv et pip (Python3.4 + django 1.7)

(J'ai fait deux fois venv, mais y a-t-il un meilleur moyen?)

$ xbuild/python-install 3.4.0 /opt/python3.4.0
$ cd /opt
$ /opt/python3.4.0/bin/pyvenv /tmp/venv
$ source /tmp/venv/bin/activate
(venv)$ pip install https://www.djangoproject.com/download/1.7b3/tarball/
(rehash on zsh)
(venv)$ python --version
Python 3.4.0
(venv)$ django-admin.py --version
1.7b3
(venv)$which pip
/opt/test2/venv/bin/pip
(venv)$ django-admin.py startproject test2
(venv)$ cd test2
(venv)$ deactivate
(rehash on zsh)
$ /opt/python3.4.0/bin/pyvenv venv
$ source venv/bin/activate
(venv) $ pip install https://www.djangoproject.com/download/1.7b3/tarball/
(rehash on zsh)

Lancez le serveur wsgi depuis la ligne de commande en utilisant tornado

De plus, j'ai fait référence aux articles suivants.

Cette fois, `` tornado_main.py '' rendra le thé boueux en plaçant le fichier suivant à la racine du projet.

(Le contenu est presque le même que https://github.com/bdarnell/django-tornado-demo, mais un point est que le numéro de port peut être changé à partir de la ligne de commande. Cela n'a rien à voir avec cette fois. HelloHandler a juste oublié de l'éteindre)

tornado_main.py


from tornado.options import options, define, parse_command_line
import django.core.handlers.wsgi
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.wsgi

define('port', type=int, default=18000)

class HelloHandler(tornado.web.RequestHandler):
  def get(self):
    self.write('Hello from tornado')


def main():
    parse_command_line()
    wsgi_app = tornado.wsgi.WSGIContainer(
        django.core.handlers.wsgi.WSGIHandler())
    tornado_app = tornado.web.Application(
        [('/hello-tornado', HelloHandler),
         ('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)),
         ])

    server = tornado.httpserver.HTTPServer(tornado_app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':
  main()

(Comme décrit plus loin, cette implémentation de tornado_main.py ne fonctionne pas lors de l'exécution avec django 1.7)

Ceux qui se sont préparés avec apt-get

$ DJANGO_SETTINGS_MODULE=test1.settings python tornado_main.py

Vérifiez les versions de Python et django

Pour pyvenv et pip

(venv)$ pip install tornado
(venv)$ PYTHONPATH=venv/lib/python3.4/site-packages DJANGO_SETTINGS_MODULE=test2.settings python tornado_main.py

Vérifiez les versions de Python et django

Démarrez les deux applications wsgi en tant que démon avec superviseur

Cette fois, le superviseur est mis en contact avec apt. Je ne pense pas que le superviseur ait l'avantage de le gérer séparément comme décrit ci-dessus.

(De plus, 3.0a8 qui peut être entré tel quel avec apt-get est très bien, mais j'ai pris la source (3.0r1.1) d'unstable et l'ai construite. Cela ne devrait pas être lié à cet article, mais à titre de référence)

Après avoir installé Supervisor avec apt, insérez les paramètres suivants sous / etc / supervisor / conf.d / ''.

/etc/supervisor/conf.d/test.conf


[program:test1]
command=python tornado_main.py --port=18101
directory=/opt/test1
autostart=true
autorestart=true
user=www-data
environment = DJANGO_SETTINGS_MODULE="test1.settings"

[program:test2]
command=/opt/test2/venv/bin/python tornado_main.py --port=18102
directory=/opt/test2
autostart=true
autorestart=true
user=www-data
environment = PYTHONPATH="/opt/test2/venv/lib/python3.4/site-packages", DJANGO_SETTINGS_MODULE="test2.settings"

Félicitations pour les deux mouvements d

App registory isn't ready yet.

2.7 est mieux, mais 3.4 ne fonctionne pas.

Plus précisément, il jette une longue exception et tombe. Vérifiez l'état en regardant /var/log/supervisor/supervisord.log.

La cause était un changement de spécification dans django 1.7.

https://docs.djangoproject.com/en/dev/releases/1.7/

If you’re using Django in a plain Python script — rather than a management command — and you rely on the DJANGO_SETTINGS_MODULE environment variable, you must now explicitly initialize Django at the beginning of your script with:

>>> import django
>>> django.setup()

Oh oui.

tornado_main2.py


from tornado.options import options, define, parse_command_line
import django
import django.core.handlers.wsgi
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.wsgi

define('port', type=int, default=18000)

class HelloHandler(tornado.web.RequestHandler):
  def get(self):
    self.write('Hello from tornado')


def main():
    // For django 1.7
    django.setup()
    parse_command_line()
    wsgi_app = tornado.wsgi.WSGIContainer(
        django.core.handlers.wsgi.WSGIHandler())
    tornado_app = tornado.web.Application(
        [('/hello-tornado', HelloHandler),
         ('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)),
         ])

    server = tornado.httpserver.HTTPServer(tornado_app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':
  main()

Désormais, les deux fonctionnent dans le même environnement de développement.

Bonus de proxy inverse avec Apcahe2

Je ne me souviens même pas du numéro de port, donc ce serait peut-être une bonne idée d'aller au proxy inverse. (Cependant, supervisord et Apache géreront les numéros de port indépendamment, ce qui peut devenir ennuyeux plus tard.)

Activez mod_proxy etc. et définissez ProxyPass '' et ProxyPassReverse ''. réduction

Assurez-vous que les versions de Python et de django sont différentes.

référence

Je ne peux pas aller subtilement à la fin, mais j'ai en fait essayé de l'exécuter sur le terminal

https://www.youtube.com/watch?v=l9gvX1oMOF4

Recommended Posts

Exécutez différentes versions des applications Python (wsgi) sur un environnement de développement
Configurer un environnement de développement Python sur Ubuntu
Construction de l'environnement de développement Python sur macOS
Construire un environnement pour python3.8 sur Mac
Installer l'environnement de développement Python sur Windows 10
Ajout d'un environnement de développement local sur MacOS
Exécutez le serveur python wsgi sur l'unité NGINX
J'ai essayé différentes versions de l'environnement Python + OpenCV + FFmpeg sur Mac
Utiliser plusieurs versions de l'environnement python avec pyenv
Exécutez des applications Web Python avec NGINX + NGINX Unit + Flask
Créez un environnement de développement Python sur votre Mac
environnement de développement python -utilisation de pyenv et virtualenv-
Configurer un environnement de développement Python sur Marvericks
Utilisons différentes versions de SQLite3 de Python3!
Construire un environnement de développement Python sur Raspberry Pi
Unification de l'environnement Python
Un mémo pour créer un environnement de développement python avec macOS Catalina
Construction de l'environnement de développement Python
Créez un environnement de développement Python 3 (Anaconda) confortable avec Windows
Créer un environnement de développement Python sur Mac OS X
À propos de l'environnement de développement Python
Construction de l'environnement de développement python2.7
Créer un environnement de développement Python à l'aide de pyenv sur MacOS
Environnement de développement en Python
Créer un environnement de développement Python avec OS X Lion
[Python] Chapitre 01-02 À propos de Python (Exécution et installation de l'environnement de développement)
Notes sur les applications et les environnements de développement installés sur macbook air Mid2013 (php, ruby, node.js, python, etc.)
Utilisation de plusieurs versions de Python sur Mac OS X (2) Utilisation
Créer un environnement de développement Python (pyenv / virtualenv) sur Mac (Homebrew)
Unifier l'environnement de l'équipe de développement Python en commençant par Poetry
Créer un environnement de développement Ubuntu python sur Google Cloud Platform
Création d'un environnement de développement local Python, partie 2 (pyenv-virtualenv, utilisation de pip)
Création d'un environnement de développement pour les applications Android - Création d'applications Android avec Python
Créer un environnement de développement Python basé sur GVim sur les paramètres de base de Windows 10 (2)
Exécutez Openpose sur Python (Windows)
Créer un environnement Python sur Windows
Exécutez Tensorflow 2.x sur Python 3.7
Installer plusieurs versions de Python
Manipulation de python sur mac
Organiser l'environnement de développement Python
Développement de l'environnement Django sur Windows 10
Exécutez le CGI de Python sur CORESERVER
[ev3dev × Python] Construction de l'environnement de développement ev3dev
Exécutez la commande unix sur python
Construire un environnement Python avec Windows
[MEMO] [Construction de l'environnement de développement] Python
[Pour organiser] Environnement de développement Python
Construction de l'environnement de python2 & 3 (OSX)
Créer une autre version de l'environnement Python conda avec une seule ligne de commande
Créer et tester un environnement CI pour plusieurs versions de Python
Création d'un environnement de développement local Python Partie 1 (installation de pyenv, pyenv-virtualenv, pip)
Utilisation de plusieurs versions de Python sur Mac OS X (1) Installation de plusieurs ver
Suite ・ Notes sur la préparation de l'environnement de développement Python sur Mac OS X
Mémorandum lors de l'exécution de Python sur EC2 avec Apache
Construire un environnement Python sur Mac
Construction d'environnement de python et opencv
Mémo de construction de l'environnement Python sur Windows 10
Construction de l'environnement Anaconda Python sous Windows 10