{"id":382,"date":"2010-01-09T17:34:58","date_gmt":"2010-01-09T16:34:58","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=382"},"modified":"2010-01-09T17:34:58","modified_gmt":"2010-01-09T16:34:58","slug":"ou-les-middleware-envahissent-la-django-application-du-mois","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/01\/09\/ou-les-middleware-envahissent-la-django-application-du-mois\/","title":{"rendered":"O\u00f9 les middleware envahissent la django-application du mois"},"content":{"rendered":"<p>Je sais, je suis impardonnable, je n&#8217;ai pas fait de billet sur la django-application de d\u00e9cembre. Vous pourriez m\u00eame rajouter que je le suis encore plus parce que d\u00e9cembre c&#8217;est le mois des vacances de No\u00ebl et que qui dit vacances dit temps pour \u00e9crire un billet.<\/p>\n<p>Oui, mais non. Parce que faut pas croire, \u00e7a prend du temps tout ces repas de f\u00eates. Plein de temps. Sans compter le temps que l&#8217;on passe \u00e0 arpenter les magasins (IRL ou sur le net d&#8217;ailleurs) pour trouver des cadeaux. Et sans parler du fait que comme d\u00e9cembre est un mois de vacances, pendant les jours de non-vacances, faut bosser encore plus pour essayer de faire autant que pendant un mois normal, mais en moins de jours.<\/p>\n<p>Autant dire que non, je n&#8217;ai pas eu le temps pour la django-app du mois.<\/p>\n<p>Et que vu mon emploi du temps en janvier, \u00e7a va \u00eatre tendu pour le billet de celle de janvier. Mais, mais, dans ma grande mansu\u00e9tude, j&#8217;ai d\u00e9cid\u00e9 de faire un billet de django app du mois de d\u00e9cembre, en retard.<\/p>\n<p>Et pour une fois, je ne parlerais pas de django-app, mais de middleware. Mais oui, les middleware django, vous savez, ce m\u00e9canisme g\u00e9nial qui permet de pluger de petit bout de code \u00e0 diff\u00e9rents niveaux de traitement des requ\u00eates. Ce qui permet de modifier plus ou moins profond\u00e9ment le comportement de django au niveau de la gestion de ses entr\u00e9es \/ sorties.<\/p>\n<p>Ca permet de faire plein de trucs, et plus encore.<\/p>\n<p>Aujourd&#8217;hui je parlerais de deux d&#8217;entre eux, un que j&#8217;utilise tr\u00e8s souvent et un autre que je vais utiliser sous peu..<\/p>\n<h1>1- Loguer les requ\u00eates SQL que fait django<\/h1>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"kw1\">from<\/span> django.<span class=\"me1\">db<\/span> <span class=\"kw1\">import<\/span> connection<br \/>\n<span class=\"kw1\">from<\/span> django.<span class=\"me1\">template<\/span> <span class=\"kw1\">import<\/span> Template<span class=\"sy0\">,<\/span> Context<br \/>\n<span class=\"kw1\">from<\/span> django.<span class=\"me1\">conf<\/span> <span class=\"kw1\">import<\/span> settings<br \/>\n<br \/>\n<span class=\"co1\">#<\/span><br \/>\n<span class=\"co1\"># Log all SQL statements direct to the console (when running in DEBUG)<\/span><br \/>\n<span class=\"co1\"># Intended for use with the django development server.<\/span><br \/>\n<span class=\"co1\">#<\/span><br \/>\n<br \/>\n<span class=\"kw1\">class<\/span> SQLLogToConsoleMiddleware:<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">def<\/span> process_response<span class=\"br0\">&#40;<\/span><span class=\"kw2\">self<\/span><span class=\"sy0\">,<\/span> request<span class=\"sy0\">,<\/span> response<span class=\"br0\">&#41;<\/span>: <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> settings.<span class=\"me1\">DEBUG<\/span> <span class=\"kw1\">and<\/span> connection.<span class=\"me1\">queries<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">time<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">sum<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"kw2\">float<\/span><span class=\"br0\">&#40;<\/span>q<span class=\"br0\">&#91;<\/span><span class=\"st0\">'time'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">for<\/span> q <span class=\"kw1\">in<\/span> connection.<span class=\"me1\">queries<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t <span class=\"sy0\">=<\/span> Template<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;{{count}} quer{{count|pluralize:&quot;<\/span>y<span class=\"sy0\">,<\/span>ies<span class=\"st0\">&quot;}} in {{time}} seconds:<span class=\"es0\">\\n<\/span><span class=\"es0\">\\n<\/span>{% for sql in sqllog %}[{{forloop.counter}}] {{sql.time}}s: {{sql.sql|safe}}{% if not forloop.last %}<span class=\"es0\">\\n<\/span><span class=\"es0\">\\n<\/span>{% endif %}{% endfor %}&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> t.<span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span>Context<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><span class=\"st0\">'sqllog'<\/span>:connection.<span class=\"me1\">queries<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">'count'<\/span>:<span class=\"kw2\">len<\/span><span class=\"br0\">&#40;<\/span>connection.<span class=\"me1\">queries<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">'time'<\/span>:<span class=\"kw3\">time<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> response<\/div><\/div>\n<p>J&#8217;ai trouv\u00e9 ce tout petit middleware sur <a title=\"djangosnippets pour loguer les requ\u00eates SQL\" href=\"http:\/\/www.djangosnippets.org\/snippets\/1672\/\">djangosnippets<\/a>. Il se contente d&#8217;afficher la liste de toutes les requ\u00eates SQL faites par django, en donnant le temps pris par leur execution.<\/p>\n<p>C&#8217;est bien utile pour v\u00e9rifier que ces vues ne font pas de la merde et pour tenter d&#8217;optimiser en factorisant des choses.<\/p>\n<h1>2- <a title=\"django-maintenancemode\" href=\"http:\/\/code.google.com\/p\/django-maintenancemode\/\">Django-maintenancemode<\/a><\/h1>\n<p>Celui-l\u00e0, je l&#8217;ai d\u00e9couvert au d\u00e9tour d&#8217;une conversation sur #django-fr. Carr\u00e9ment plus pratique que la b\u00eate page html qui dit &#8216;en maintenance&#8217;, utile \u00e0 conna\u00eetre et \u00e0 avoir dans sa django-bo\u00eete \u00e0 outil.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je sais, je suis impardonnable, je n&#8217;ai pas fait de billet sur la django-application de d\u00e9cembre. Vous pourriez m\u00eame rajouter que je le suis encore plus parce que d\u00e9cembre c&#8217;est le mois des vacances de No\u00ebl et que qui dit vacances dit temps pour \u00e9crire un billet. Oui, mais non. Parce que faut pas croire, &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/01\/09\/ou-les-middleware-envahissent-la-django-application-du-mois\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">O\u00f9 les middleware envahissent la django-application du mois<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[35],"tags":[99,98],"class_list":["post-382","post","type-post","status-publish","format-standard","hentry","category-la-django-app-du-mois","tag-django","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-6a","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=382"}],"version-history":[{"count":2,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/382\/revisions"}],"predecessor-version":[{"id":384,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/382\/revisions\/384"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}