WSGI, Django, Gunicorn

8,754 views
8,495 views

Published on

Presentation given at #djangocong

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,754
On SlideShare
0
From Embeds
0
Number of Embeds
87
Actions
Shares
0
Downloads
80
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

WSGI, Django, Gunicorn

  1. 1. WSGI, Django & Gunicorn Benoît Chesneau 25/04/2010 - djangocong Sunday, April 25, 2010
  2. 2. benoît chesneau benoitc@apache.org Artisan web Minimal web & Opensource Enki Multimedia http://www.e-engura.com Sunday, April 25, 2010
  3. 3. • WSGI ? • Django & WSGI • Gunicorn Sunday, April 25, 2010
  4. 4. WSGI ? • Web Server Gateway Interface • PEP 333 • Interface entre le web et une application Python Sunday, April 25, 2010
  5. 5. Serveur web WSGI Application Python Sunday, April 25, 2010
  6. 6. simple application def app(environ, start_response): """Simplest possible application object""" data = 'Hello, World!n' status = '200 OK' response_headers = [ ('Content-type','text/plain'), ('Content-Length', str(len(data))) ] start_response(status, response_headers) return iter([data]) Sunday, April 25, 2010
  7. 7. WSGI ? • Réutilisation d’applications • Middleware • Paster • Frameworks: webob, werkzeug, bottle, repoze, ... Sunday, April 25, 2010
  8. 8. Middleware WSGI class CustomHeader(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): environ["HTTP_X_MY_HEADER"] = "1" return self.app(environ, start_response) Sunday, April 25, 2010
  9. 9. Serveur web WSGI Application Python App App App Sunday, April 25, 2010
  10. 10. Django & WSGI Sunday, April 25, 2010
  11. 11. Intégrer • Pourquoi réinventer la roue ? • Principes communs: middlewares, request, ... • Réutiliser les applications. • intégrer != compatible wsgi Sunday, April 25, 2010
  12. 12. • django-wsgi • twod.wsgi Sunday, April 25, 2010
  13. 13. django-wsgi • pas de dependance • permet d’embarquer des apps wsgi, `django_view` • permet de creer une app wsgi à partir d’une vue ou des urls, `wsgi_application` Sunday, April 25, 2010
  14. 14. django_view def test_app(environ, start_response): start_response("200 OK", [("Content-type", "text/ html")]) yield "i suck" def test_app1(request): return HttpResponse("wowa, meta") urls = patterns("", .. (r"^test/$", django_view(test_app)), (r"^(?P<name>.*?)/$", test_app1), .. ) application = wsgi_application(urls) Sunday, April 25, 2010
  15. 15. twod.wsgi • vise à créer une "paserelle coopérative" entre Django et WSGI • basé sur webob (wrap HttpRequest et HttpResponse) • Paste deploy factory • Middleware pour le routage Sunday, April 25, 2010
  16. 16. twod.wsgi - embed import os from twod.wsgi import DjangoApplication os.environ['DJANGO_SETTINGS_MODULE'] = "yourpackage.settings" django_app = DjangoApplication() Sunday, April 25, 2010
  17. 17. twod.wsgi routing args (r'^/blog/posts/(?<post_slug>w+)/comments/(? <post_comment_id>d+)$' >>> request.urlvars {'post_slug': "hello-world", 'post_comment_id': "3"} Sunday, April 25, 2010
  18. 18. twod.wsgi - embed • intégrer une application WSGI au sein de votre projet django • modifier les requêtes/réponses • Integrer votre app django dans une app WSGI Sunday, April 25, 2010
  19. 19. embarque les apps WSGI from twod.wsgi import call_wsgi_app from somewhere import wsgi_app def run_app(request, path_info): response = call_wsgi_app(wsgi_app, request, path_info) response['Server'] = "twod.wsgi 1.0" return response Sunday, April 25, 2010
  20. 20. Déployer • l’utilisation courante de Django avec WSGI • 2 types de deploiements : • via serveur • via proxy Sunday, April 25, 2010
  21. 21. Serveur • uWSGI • mod_proxy Sunday, April 25, 2010
  22. 22. proxy • spawning, paster, ... • cherrypy, .. • gunicorn Sunday, April 25, 2010
  23. 23. Sunday, April 25, 2010
  24. 24. Sunday, April 25, 2010
  25. 25. gunicorn • Green unicorn • WSGI 1.0, clients lents et rapides • supporte WSGI, Paster compatible app & ... Django • Load balancing via pre-fork and un socket partagé • Upgrade à chaud “à la nginx” Sunday, April 25, 2010
  26. 26. mais encore... • HTTP Stream. Décode le HTTP à la volée • Gestion des connexions asynchrones (longpolling, comet, websockets, appels d’api, ...). • Eventlet, Gevent, Tornado • DSL Config Sunday, April 25, 2010
  27. 27. Philosophie • Simple • Minimal • Performant • Unix Sunday, April 25, 2010
  28. 28. Simple • gunicorn_django -w 3 /myproject/ settings.py • ./manage.py run_django -w 3 • gunicorn_django -w 3 -k “egg:gunicorn#eventlet” /myproject/ settings.py Sunday, April 25, 2010
  29. 29. Simple • Taille memoire controllée • Derrière NGINX • Full Python • Graceful Reload Sunday, April 25, 2010
  30. 30. http://www.peterbe.com/plog/fcgi-vs-gunicorn-vs-uwsgi gunicorn is the winner in my eyes. It's easy to configure and get up and running and certainly fast enough [..] . Sunday, April 25, 2010
  31. 31. DEMO Sunday, April 25, 2010
  32. 32. 0.9 • Parseur HTTP en C (fallback en python sur les plateformes non supportées) • Increase unitests • Reload hook • status ? Sunday, April 25, 2010
  33. 33. Liens • http://gunicorn.org • http://e-engura.org • http://www.python.org/dev/peps/pep-0333/ • http://bitbucket.org/2degrees/twod.wsgi/ • http://github.com/alex/django-wsgi Sunday, April 25, 2010
  34. 34. Questions Sunday, April 25, 2010
  35. 35. @benoitc Sunday, April 25, 2010
  36. 36. Cette création est mise à disposition selon le Contrat Paternité 2.0 France disponible en ligne http:// creativecommons.org/licenses/by/2.0/fr/ ou par courrier postal à Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. Sunday, April 25, 2010

×