{"id":377,"date":"2010-01-09T15:23:51","date_gmt":"2010-01-09T14:23:51","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=377"},"modified":"2010-01-09T15:27:17","modified_gmt":"2010-01-09T14:27:17","slug":"les-nouveautes-de-django-1-2-alpha","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/01\/09\/les-nouveautes-de-django-1-2-alpha\/","title":{"rendered":"Les nouveaut\u00e9s de django 1.2 alpha"},"content":{"rendered":"<p>Avant de commencer \u00e0 te faire perdre ton temps, je tiens \u00e0 te pr\u00e9venir cher lecteur. Si tu as lu la <a title=\"releade note django 1.2 alpha\" href=\"http:\/\/docs.djangoproject.com\/en\/dev\/releases\/1.2-alpha-1\/\">release note de django 1.2 alpha 1<\/a>, tu n&#8217;apprendras rien de plus en lisant ce petit billet.<\/p>\n<p>Pourquoi alors l&#8217;\u00e9crire ?<\/p>\n<p>Au cas o\u00f9 tu n&#8217;aurais pas encore lu la release note et que lire du fran\u00e7ais t&#8217;amuse plus que lire de l&#8217;anglais. Et puis comme \u00e7a, en plus, tu as le lien vers la release note.<\/p>\n<h1>1- Les trucs nouveaux<\/h1>\n<h2>1.1- <a title=\"proctection contre les attaques CSRF\" href=\"http:\/\/docs.djangoproject.com\/en\/dev\/ref\/contrib\/csrf\/#ref-contrib-csrf\">protection contre les attaques CSRF<\/a>.<\/h2>\n<p>Les attaques CSRF (Cross-Site Request Foregery) sont rendus\u00a0 possible par le partage des donn\u00e9es de login\/session entre les diff\u00e9rents onglets d&#8217;un navigateur. Du coup, si vous \u00eates logu\u00e9s sur un site quelconque (prenons facebook comme exemple) et que vous allez sur le site d&#8217;un vilain m\u00e9chant pirate, le vilain m\u00e9chant pirate pourrait faire des actions sur Facebook, comme si c&#8217;\u00e9tait vous qui les faisiez. (Bon pour pouvoir faire cela, il faut que vous cliquiez sur un lien du site du vilain pirate, ou que vous soumettiez un formulaire ou que vous executiez du js).<\/p>\n<p>Django impl\u00e9mente maintenant une fa\u00e7on cool de s&#8217;en prot\u00e9ger. (avant il existait un middleware pour le faire). Moralit\u00e9, si Facebook \u00e9tait en django 1.2, les attaques CSRF ne seraient pas possible.<\/p>\n<h2>1.2- <a title=\"e-mail backends\" href=\"http:\/\/docs.djangoproject.com\/en\/dev\/topics\/email\/#topic-email-backends\">Backends des emails<\/a><\/h2>\n<p>On peut maintenant configurer la fa\u00e7on que django aura d&#8217;envoyer des emails. Sympa pour pouvoir debugger et tester les envois d&#8217;emails, \u00e7a \u00e9vitera d&#8217;avoir \u00e0 passer par des simulateurs de SMTP.<\/p>\n<h2>1.3- Le <a title=\"messages Framework\" href=\"http:\/\/docs.djangoproject.com\/en\/dev\/ref\/contrib\/messages\/#ref-contrib-messages\">framework d&#8217;envoi de messages<\/a><\/h2>\n<p>Il remplacera l&#8217;ancienne API d&#8217;envoi de message et apparemment, il va \u00eatre juste terrible. Les users authentifi\u00e9s ou anonyme pourront en envoyer, on pourra les stocket en session ou en cookie, g\u00e9rer des levels, des tags, que du bon quoi<\/p>\n<h2>1.4- <a title=\"Vive les multi db\" href=\"http:\/\/docs.djangoproject.com\/en\/dev\/topics\/db\/multi-db\/#topics-db-multi-db\">Support des multiples bases de donn\u00e9es<\/a><\/h2>\n<p>Alors \u00e7a, je l&#8217;attendais avec une impatience extr\u00eame. On pourra maintenant dire \u00e0 django de se connecter \u00e0 X bd diff\u00e9rentes, choisir pour chaque requ\u00eate bd sur quelle base on veut la faire ou o\u00f9 est ce que l&#8217;on veut sauver une instance de mod\u00e8le. Que du bon quoi. Pour ne pas dire de la tuerie<\/p>\n<h2>1.5- Un tag if coolos<\/h2>\n<p>L\u00e0 on peut r\u00e9sumer en une phrase : &#8216;Fini le ifnotequal a b et vive le if a != b&#8217;.<\/p>\n<p>Les op\u00e9rateurs de comparaisons sont enfin support\u00e9. On pourra donc utiliser :<\/p>\n<ul>\n<li>==<\/li>\n<li>!=<\/li>\n<li>&lt;<\/li>\n<li>&gt;<\/li>\n<li>&lt;=<\/li>\n<li>&gt;=<\/li>\n<li>in<\/li>\n<li>et and or et not (qui fonctionnaient d\u00e9j\u00e0).<\/li>\n<\/ul>\n<p>Et en plus, on pourra utiliser des filtres en m\u00eame temps. Avec un {% if\u00a0 inst1.var1|bla == inst2.var2|tut %}<\/p>\n<p>Le pied je vous dis.<\/p>\n<h2>1.6- Gestion du cache des templates<\/h2>\n<p>On pourra configurer un truc de gestion de cache des templates. Et \u00e7a, c&#8217;est bien.<\/p>\n<h2>1.7- Cl\u00e9s en BD<\/h2>\n<p>On peut maintenant utiliser les <a title=\"c'est quoi une natural key ?\" href=\"http:\/\/docs.djangoproject.com\/en\/dev\/topics\/serialization\/#topics-serialization-natural-keys\">naturals keys<\/a> dans les fixtures (j&#8217;ai pas trouv\u00e9 de traduction fran\u00e7aise qui me convenait). Ce qui peut-\u00eatre bien sympa quand par exemple on a des fixtures qui bossent avec des content types (au hasard hein )<\/p>\n<p>Et on peut maintenant utiliser des int de 64 bits avec le BigIntegerField .<\/p>\n<h2>1.8- En vrac<\/h2>\n<ul>\n<li>une commande en plus sur le runtest qui permet de faire sortir le lanceur de test d\u00e9s qu&#8217;il y a une erreur.<\/li>\n<li>Une am\u00e9lioration de la localisation pour les dates et les nombres qui seront affich\u00e9s (si l&#8217;option est activ\u00e9e) de la fa\u00e7on qui va bien en fonction de la locale.<\/li>\n<li>L&#8217;ajout de la\u00a0 propri\u00e9t\u00e9 readonly_fields pour les champs non \u00e9ditable (enfin)<\/li>\n<li>la possibilit\u00e9 de customiser les couleurs pour les highlight dans la parti admin.<\/li>\n<\/ul>\n<h1>2- Les trucs\u00a0 obsol\u00e8tes ou incompatibles<\/h1>\n<p>Bon alors d\u00e9j\u00e0, une nouvelle qui va faire que tout le monde va respirer, dans le 1.2 les trucs obsol\u00e8tes seront encore support\u00e9s. Le support n&#8217;en sera supprim\u00e9 que dans la version 1.4.\u00a0 \u00c7a laisse donc un peu de temps pour organiser ses migrations.<\/p>\n<h2>2.1- Le middleware CSRF<\/h2>\n<p>Forc\u00e9ment si la protection anti CSRF est refait d&#8217;une mani\u00e8re mieux, l&#8217;ancienne mani\u00e8re devient obsol\u00e8te.<\/p>\n<h2>2.2- SMTPConnection<\/h2>\n<p>Ceux qui utilisaient la classe SMTPConnection pour envoyer des mails devront changer leur code. Heureusement les modifs sont l\u00e9g\u00e8re (il suffit apparemment de remplacer l&#8217;appel au constructeur de la classe par un appel a get_connection () )<\/p>\n<h2>2.3- La configuration de la base de donn\u00e9es<\/h2>\n<p>Forc\u00e9ment \u00e7a change. Faudra passer dans la syntaxe multidb, m\u00eame si on a qu&#8217;une seule db.<\/p>\n<h2>2.4- L&#8217;API d&#8217;envoi de message.<\/h2>\n<p>L\u00e0 encore, faut passer \u00e0 la nouvelle version. Mais \u00e7a n&#8217;a pas l&#8217;air super compliqu\u00e9. Du replace de nom de fonction et \u00e7a devrait le faire.<\/p>\n<h2>2.5- Les helpers de formatage de date.<\/h2>\n<p>Les fonctions django.utils.translation.get_date_formats() et django.utils.translation.get_partial_date_formats() sont obsol\u00e8tes et il faudra les remplacer par django.utils.formats.get_format()<\/p>\n<h2>2.6- En vrac<\/h2>\n<ul>\n<li>Du fait des nouvelles fonctionnalit\u00e9s du if, appeler des variable &#8216;and&#8217;, &#8216;or&#8217; ou &#8216;not&#8217; est encore moins une bonne id\u00e9e, vu que vous allez vous manger des TemplateSyntaxError. Bon de toute fa\u00e7on, c&#8217;\u00e9tait d\u00e9j\u00e0 une tr\u00e8s tr\u00e8s mauvaise id\u00e9e d&#8217;appeler des variables &#8216;and&#8217;, &#8216;or&#8217; ou &#8216;not&#8217;, donc &#8230;<\/li>\n<li>Le LazyObject. Ceux qui utilisaient cette classe non document\u00e9e vont devoir modifier leur fa\u00e7on de l&#8217;utiliser.<\/li>\n<li>Modification de ce que contient le __dict__ dans les instances de Model : Jusqu&#8217;\u00e0 pr\u00e9sent le __dict__ ne contenait que les attributs qui correspondaient au champ du mod\u00e8le. Maintenant il contient un attribut _state qui sert \u00e0 g\u00e9rer les db multiple. Ceux qui itere sur le __dict__ de Model devront faire attention \u00e0 filtrer le _state<\/li>\n<li>les fonction get_db_prep_* des Fields ont chang\u00e9 de signature (et il y en a 2 de plus get_db_prep_save et get_prep_lookup )<\/li>\n<li>du fait de l&#8217;utilisation du cache loader, il faut bien v\u00e9rifier que les templates tags utilis\u00e9s sont bien thread-safe (je sais pas pourquoi je sens que ce point l\u00e0 va \u00eatre le point de d\u00e9part de dizaines de touffes de cheveux de geeks arrach\u00e9es).<\/li>\n<li>Code de retour du lanceur de test : Le code de retour du lanceur de test ne correspond plus au nombre de test rat\u00e9. C&#8217;est maintenant 0 si aucun test n&#8217;a merd\u00e9, 1 si il y a eu des merdes.<\/li>\n<\/ul>\n<h1>3- Conclusion<\/h1>\n<p>Que du bon dans cette nouvelle version donc. Et en plus pas sp\u00e9cialement beaucoup de modifications \u00e0 faire pour profiter des nouvelles am\u00e9liorations. Vivement le 9 mars que la stable sorte quoi. \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avant de commencer \u00e0 te faire perdre ton temps, je tiens \u00e0 te pr\u00e9venir cher lecteur. Si tu as lu la release note de django 1.2 alpha 1, tu n&#8217;apprendras rien de plus en lisant ce petit billet. Pourquoi alors l&#8217;\u00e9crire ? Au cas o\u00f9 tu n&#8217;aurais pas encore lu la release note et que &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/01\/09\/les-nouveautes-de-django-1-2-alpha\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Les nouveaut\u00e9s de django 1.2 alpha<\/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":[6],"tags":[99,98],"class_list":["post-377","post","type-post","status-publish","format-standard","hentry","category-django","tag-django","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-65","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/377","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=377"}],"version-history":[{"count":4,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/377\/revisions"}],"predecessor-version":[{"id":380,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/377\/revisions\/380"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}