[GO] Führen Sie verschiedene Versionen von Python (wsgi) -Apps in einer Entwicklungsumgebung aus

Einführung

Ich habe Python 2.7 und Django 1.4 in meiner Linux-Entwicklungsumgebung über Befehle zur Verwaltung von Betriebssystempaketen installiert. Die App, die ich jetzt mache, funktioniert in dieser Umgebung, also gab es kein Problem.

Irgendwann habe ich beschlossen, Django 1.7, das in Kürze veröffentlicht wird, mit Python 3.4 zu kombinieren, um zu sehen, welche Schwierigkeiten mich erwarten.

Kurz gesagt, wir möchten eine Situation erreichen, in der wir die vorhandene Entwicklungsumgebung nicht zerstören, während wir unter derselben Umgebung an fortschrittlichen Technologien forschen.

Dieses "eine Betriebssystem, mehrere Python und Django" ist jedoch unerwartet schwierig. Das letzte Mal, als ich es ausprobiert habe (http://qiita.com/amedama/items/79994598d9f4daa69d13), wurde es gestoppt, weil ich nicht mehrere Arten von Apache2 mod_wsgi haben konnte.

Als Alternative werde ich dieses Mal versuchen, dieses Problem zu lösen, indem ich einen unabhängigen wsgi-Server auf demselben Host einrichte und als Bonus einen Reverse-Proxy von Apache2 einrichte.

Speziell

Wir werden untersuchen, wie diese beiden Umgebungen in einer Entwicklungsumgebung parallel gestartet werden können.

Als Bonus bin ich in Django 1.7 auf inkompatible Änderungen gestoßen, daher werde ich das auch vorstellen.

Außerdem werde ich am Ende des Artikels ein 7-minütiges Video vorstellen, das den Inhalt dieses Artikels auf dem Terminal tatsächlich (als Teil davon) übte. Egal, ob Sie den Artikel lesen, das Video ansehen oder beides genießen möchten, machen Sie bitte, was Sie wollen.

Hauptcharaktere

django app views.py

Diesmal ist der Inhalt von views.py selbst nicht wesentlich, daher werden wir Folgendes verwenden. Es werden nur die Python-Version und die Django-Version im Klartext zurückgegeben.

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")

Ausführen, um den Server zu verwalten

Was ich mit apt eingefügt habe (Python 2.7 + django 1.4)

Es wird davon ausgegangen, dass Tornado, Django (älterer) usw. im Voraus vorbereitet werden. Ich denke, Sie können sudo pip oder apt-get (in Debian) verwenden.

Serpentine: Mit pip wird die 1.6-Serie aufgenommen, wenn Sie die Version nicht angeben. In diesem Artikel kommt Debian wheezy (7.5) apt-get install python-django dem Ergebnis des Artikels am nächsten. Soweit ich weiß, enthält Ubuntu 12.04 LTS Django 1.3 und Ubuntu 14.04 LTS 1.6. Der Punkt ist, dass es von der Umgebung abhängt. Wichtig ist, dass Django 1.7 nicht enthalten ist. Für Python 3.4 wird Ubuntu 14.04 LTS mit apt-get eingegeben.

Pyvenv und Pip voll ausnutzen (Python3.4 + Django 1.7)

(Ich habe zweimal venv gemacht, aber gibt es einen besseren Weg?)

$ 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)

Starten Sie den wsgi-Server über die Befehlszeile mit Tornado

Außerdem habe ich auf folgende Artikel verwiesen.

Dieses Mal macht `` `tornado_main.py``` den Tee schlammig, indem die folgende Datei im Stammverzeichnis des Projekts abgelegt wird.

(Der Inhalt ist fast der gleiche wie bei https://github.com/bdarnell/django-tornado-demo, aber ein Punkt ist, dass die Portnummer über die Befehlszeile geändert werden kann. Dies hat nichts mit dieser Zeit zu tun. HelloHandler hat nur vergessen, es auszuschalten)

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()

(Wie später beschrieben, funktioniert diese Implementierung von tornado_main.py nicht, wenn sie mit django 1.7 ausgeführt wird.)

Diejenigen, die sich mit apt-get vorbereitet haben

$ DJANGO_SETTINGS_MODULE=test1.settings python tornado_main.py

Überprüfen Sie die Python- und Django-Versionen

Für Pyvenv und Pip

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

Überprüfen Sie die Python- und Django-Versionen

Starten Sie beide wsgi-Apps als Daemon mit Supervisor

Diesmal wird der Supervisor mit apt beauftragt. Ich glaube nicht, dass der Supervisor den Vorteil hat, es wie oben beschrieben separat zu verwalten.

(Außerdem ist 3.0a8, das wie mit apt-get eingegeben werden kann, in Ordnung, aber ich habe die Quelle (3.0r1.1) aus instabil genommen und erstellt. Sie sollte sich nicht auf diesen Artikel beziehen, sondern als Referenz dienen.)

Fügen Sie nach der Installation von Supervisor mit apt die folgenden Einstellungen unter `/ etc / Supervisor / conf.d /` ein.

/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"

Herzlichen Glückwunsch zu beiden Bewegungen d

App registory isn't ready yet.

2.7 ist besser, aber 3.4 funktioniert nicht.

Insbesondere wirft es eine lange Ausnahme aus und fällt. Überprüfen Sie den Status unter /var/log/supervisor/supervisord.log.

Die Ursache war eine Spezifikationsänderung in 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 ja.

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()

Jetzt arbeiten beide in derselben Entwicklungsumgebung.

Bonus Reverse Proxy mit Apcahe2

Ich kann mich nicht einmal an die Portnummer erinnern, daher ist es möglicherweise eine gute Idee, zum Reverse-Proxy zu wechseln. (Supervisord und Apache verwalten die Portnummern jedoch unabhängig voneinander, was später ärgerlich werden kann.)

Aktivieren Sie mod_proxy usw. und setzen Sie `ProxyPass``` und` ProxyPassReverse```. Kürzung

Stellen Sie sicher, dass die Versionen von Python und Django unterschiedlich sind.

Referenz

Ich kann nicht subtil bis zum Ende gehen, aber ich habe tatsächlich versucht, es auf dem Terminal auszuführen

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

Recommended Posts

Führen Sie verschiedene Versionen von Python (wsgi) -Apps in einer Entwicklungsumgebung aus
Richten Sie eine Python-Entwicklungsumgebung unter Ubuntu ein
Aufbau einer Python-Entwicklungsumgebung unter macOS
Erstellen einer Umgebung für Python3.8 auf einem Mac
Installieren Sie die Python-Entwicklungsumgebung unter Windows 10
Hinzufügen einer lokalen Entwicklungsumgebung unter MacOS
Führen Sie den Python-WSGI-Server auf der NGINX-Einheit aus
Ich habe verschiedene Versionen der Python + OpenCV + FFmpeg-Umgebung auf dem Mac ausprobiert
Verwenden Sie mit pyenv mehrere Versionen der Python-Umgebung
Führen Sie Python-Webanwendungen mit NGINX + NGINX Unit + Flask aus
Erstellen Sie eine Python-Entwicklungsumgebung auf Ihrem Mac
Python-Entwicklungsumgebung - Verwendung von Pyenv und Virtualenv-
Richten Sie eine Python-Entwicklungsumgebung auf Marvericks ein
Verwenden wir verschiedene Versionen von SQLite3 aus Python3!
Erstellen Sie eine Python-Entwicklungsumgebung auf Raspberry Pi
Vereinheitlichung der Python-Umgebung
Memo zum Erstellen einer Python-Entwicklungsumgebung mit macOS Catalina
Aufbau einer Python-Entwicklungsumgebung
Erstellen Sie eine komfortable Python 3 (Anaconda) -Entwicklungsumgebung mit Windows
Erstellen Sie eine Python-Entwicklungsumgebung unter Mac OS X.
Informationen zur Python-Entwicklungsumgebung
python2.7 Konstruktion der Entwicklungsumgebung
Erstellen Sie eine Python-Entwicklungsumgebung mit pyenv unter MacOS
Entwicklungsumgebung in Python
Erstellen Sie eine Python-Entwicklungsumgebung mit OS X Lion
[Python] Kapitel 01-02 Über Python (Ausführung und Installation der Entwicklungsumgebung)
Hinweise zu Apps und Entwicklungsumgebungen, die auf dem MacBook Air Mid2013 installiert sind (PHP, Ruby, Node.js, Python usw.)
Verwenden mehrerer Versionen von Python unter Mac OS X (2) Verwendung
Erstellen Sie eine Python-Entwicklungsumgebung (pyenv / virtualenv) auf einem Mac (Homebrew).
Vereinheitlichen Sie die Umgebung des Python-Entwicklungsteams, beginnend mit Poetry
Erstellen Sie eine Ubuntu-Python-Entwicklungsumgebung auf der Google Cloud Platform
Erstellen einer lokalen Python-Entwicklungsumgebung Teil 2 (pyenv-virtualenv, Pip-Nutzung)
Erstellen einer Entwicklungsumgebung für Android-Apps - Erstellen von Android-Apps mit Python
Erstellen Sie eine GVim-basierte Python-Entwicklungsumgebung unter Windows 10 (2) Grundeinstellungen
Führen Sie Openpose unter Python (Windows) aus.
Erstellen Sie eine Python-Umgebung unter Windows
Führen Sie Tensorflow 2.x unter Python 3.7 aus
Installieren Sie mehrere Versionen von Python
Umgang mit Python auf Mac
Organisieren Sie die Python-Entwicklungsumgebung
Entwicklung der Django-Umgebung unter Windows 10
Führen Sie Pythons CGI auf CORESERVER aus
[ev3dev × Python] Aufbau einer ev3dev-Entwicklungsumgebung
Führen Sie den Unix-Befehl auf Python aus
Erstellen Sie eine Python-Umgebung mit Windows
[MEMO] [Entwicklung der Entwicklungsumgebung] Python
[Zum Organisieren] Python-Entwicklungsumgebung
Umgebungskonstruktion von Python2 & 3 (OSX)
Erstellen Sie eine andere Version der Python-Conda-Umgebung mit einer Befehlszeile
Erstellen und testen Sie eine CI-Umgebung für mehrere Versionen von Python
Erstellen einer lokalen Python-Entwicklungsumgebung Teil 1 (pyenv, pyenv-virtualenv, pip-Installation)
Verwenden mehrerer Versionen von Python unter Mac OS X (1) Installation von Multiple Ver
Fortsetzung ・ Hinweise zur Vorbereitung der Python-Entwicklungsumgebung unter Mac OS X.
Memorandum beim Ausführen von Python auf EC2 mit Apache
Erstellen einer Python-Umgebung auf einem Mac
Umgebungskonstruktion von Python und OpenCV
Python-Umgebungskonstruktionsnotiz unter Windows 10
Aufbau einer Anaconda-Python-Umgebung unter Windows 10