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.
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")
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.
django-admin startproject test1
python mangae.py syncdb
python manage.py runserver
(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)
db / db.sqlite3```python mangae.py syncdb
python manage.py runserver
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)
$ DJANGO_SETTINGS_MODULE=test1.settings python tornado_main.py
Vérifiez les versions de Python et django
(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
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.
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.
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