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.
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")
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.
django-admin startproject test1
python mangae.py syncdb
python manage.py runserver
(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)
python mangae.py syncdb
python manage.py runserver
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.)
$ DJANGO_SETTINGS_MODULE=test1.settings python tornado_main.py
Überprüfen Sie die Python- und Django-Versionen
(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
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.
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.
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