PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Qu’est ce qu’un middleware Django ?

dimanche 7 octobre 2012 à 21:47

Vous savez qu’il y a un settings qui ressemble à ça:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

Vous savez qu’il est important. Vous ne savez pas vraiment pourquoi.

WaT iZ a MideulWaire ?

Un middleware est un moyen d’éxécuter du code à toutes requêtes et/ou à toutes les réponses reçues et envoyées par Django. Si vous ne voyez pas comment fonctionne le cyle de requêtes/réponses, faites un petit saut sur notre schéma de fonctionnement général de Django.

Un middleware, c’est une classe Python ordinaire, avec deux méthodes: une appelée pour les requêtes, une appelée pour les réponses.

L’exemple bidon habituel

class MideulWaireForEverReturnsTheRevenge3(object):
 
    # cette méthode sera appelée automatiquement pour chaque requête
    # et Django lui passera la requête en cours
    def process_request(self, request):
        print "Hey, une requête est arrivée !"
        # on est pas obligé de retourner quoi que ce soit
 
    # cette méthode sera appelée automatiquement pour chaque réponse
    # et Django lui passera la reponse en cours et la requete
    # à laquelle on répond
    def process_response(self, request, response):
        print "Hey, on a répondu a une requête !"
        # on DOIT retourner une réponse
        return response

On met tout ça dans un fichier mon_projet/mon_app/middlewares.py, et on active le middleware en le rajoutant dans les settings:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'mon_projet.mon_app.middlewares.MideulWaireForEverReturnsTheRevenge3'
)

Et à chaque reload de page, dans l’affichage du terminal de dev, on a ça:

Capture d'écran de l'output terminal de ./mange.py runserver avec un middleware qui print sur stdout

./manage.py runserver

Et voici ce qui se passe dans le fonctionnement de Django: il trouve la liste des classes de middlewares, et pour chaque requête et réponse, il appelle les méthodes process_response et process_request de chaque middleware.

Schéma de fonctionnement des middlewares en Django

C'est l'histoire de la viiiiiiiiiiiiiie. C'est le cycle éterneeeeeleuuuuuuuuuuuu

Les points les plus importants

Aucune méthode n’est obligatoire, vous pouvez créer un middleware avec uniquement l’une ou l’autre.

Si process_request renvoit une réponse, tout s’arrête. Les process_request des autres middlewares ne sont pas appelés, vos vues ne sont pas appelées, et c’est le cycle de réponse qui commence directement. Très utile si par exemple vous voulez faire une redirection brutale pour toutes les requêtes qui correspondent à un certain critère (par exemple rediriger vers un site mobile).

Les middlewares sont appelés dans leur ordre de déclaration dans MIDDLEWARE_CLASSES pour chaque requête, et dans l’odre inverse pour chaque réponse. Mettez donc votre middleware au bon endroit dans la file: inutile de mettre un middleware qui vérifie si un user a des droits avant le middleware d’authentification, puisque l’utilisateur n’est pas encore authentifié.

Un middleware peut posséder 3 autres méthodes également facultatives: process_view (appelée juste avant l’appel de chaque vue, et et permettant de modifier l’instance de la vue elle-même), process_template_response (appelée sur chaque instance implémentant une méthode render, et surtout utilisée pour injecter des données dans TemplateResponse) et process_exception (appelée quand une vue lève une exception).

Pour quoi utiliser les middleware ?

Exemples de quelques middlewares qui viennent d’office avec Django:

Il y en a beaucoup d’autres, et il y en a plein qui trainent sur internet. Mais bien entendu le plus chouette, c’est d’en faire un soi-même.

Par exemple, quand je développe (pas en prod, hien !), j’utilise souvent ce petit middleware que j’ai fait avec amour:

class ForceSuperUserMiddleWare(object):
    def process_request(self, request):
        request.user = User.objects.filter(is_superuser=True)[0]

Comme ça je suis toujours connecté en tant que super user, même sur les projets avec des timeout courts pour la session, des doubles authentifications super relous et tout le toutim des clients paranos (traduction: des américains).

Où trouver un Job ou une mission Python / Django ?

samedi 6 octobre 2012 à 23:03

Je vois ici et là encore des gens qui se posent la question, et ça m’étonne, car il y a pénurie de devs, donc du besoin partout.

Les annonces françaises

Si vous cherchez en France, il y a de bonnes annonces sur des sites spécialisés comme lesjeudis,trovit, l’afpy et human coders, et nous agrégeons les 4 sur le multiboards. Dans ceux qu’on agrège pas, il y a alsacreations, indeed, jobintree, keljob, monster, option carriere, wanajob et bien entendu Google… Ne perdez pas de temps sur les sites officiels type Apec, Anpe, Pôle emploi, etc. C’est beaucoup de temps pour un très mauvais retour.

(Et c’est là que je me dis que faire un méta moteur de recherche pour des annonces uniquement sur Python, ça pourrait être trop cool)

Si vous êtes freelance, vous devriez quand même utiliser ces sites car les offres y sont pèles mêle, et il y a des missions dans le lot. De plus, si vous voyez écrit quelque chose dans une annonce, ça ne veut pas dire qu’on ne peut pas proposer autre chose. Offrez vos talents en tant que freelance à quelqu’un qui cherche à embaucher en CDD, et même parfois en CDI, peut parfaitement marcher. Ca ne coûte rien, et au pire les gens ont votre CV et vous avez leurs contacts, et rien que pour ça, ça vaut la peine.

Parfois les sites ne proposent pas les contacts. Soyez créatifs: vous êtes informaticien, utilisez les outils informatiques à votre disposition pour retrouver la société à travers une annonce sur un site concurrent, un dossier de presse qui parle du projet sur lequel on embauche, la localisation géographique, le nombre d’employés, les technos utilisées, le nom du contact… On augmente drastiquement ses chances quand on contacte les gens en direct, pas à travers un site, donc n’hésitez pas à passer quelques heures pour trouver la source d’une annonce. Dans le cas où il y a trop peu d’infos pour lancer une recherche, laissez tomber. Un employer qui met 3 lignes dans sont annonce hors de Twitter, ça sent le job pourri.

Les annonces anglaises

Les meilleurs jobs (les projets les plus cools et les mieux payés), impliquent presque tous un environnement de travail anglophone. Si vous ne parlez pas anglais, commencez dès maintenant à chercher des cours, c’est un investissement sur votre vie à très haut rendement.

Attention, ça ne veut pas dire que vous aurez à aller travailler à l’étranger. Il y a des boîtes qui communiquent en anglais basées en France, et d’autres qui acceptent le télétravail. J’ai déjà travaillé pour Paris depuis Madrid, Baltimore depuis Bangkok, New York depuis Bamako, etc.

On trouve des annonces sympa sur:

Et pour Django uniquement:

Hors annonces

Certains sites non destinés à l’emploi sont excellents pour ça malgré tout. Passez du temps sur les forum spécialisés de votre métier, par exemple django-fr. Enregistrez-vous comme expert sur les listings spécialisés comme django gigs et la map officielle des dev Django. Inscrivez-vous aux mailling lists. Si vous avez un compte sur Stackoverflow, mettez votre email dedans et spécifiez que vous cherchez du travail.

Faites une veille informationnelles régulière: les blogs et les journaux publient souvent des annonces. Il n’y a pas une semaine sans que cette recherche sur Twitter ne contienne une offre de travail Python. Nous même on retweet des offres régulièrement. Oui, ça prend du temps, la veille informationnelle. Ça me prend environ une heure par jour, depuis 15 ans. Ça fait parti du job. Comment vous croyez qu’on obtient la connaissance pour écrire ces articles ?

Enfin il faut mettre le nez dehors. Allez dans les lieux où il y à d’autres geek: espaces de co-working, hacker spaces, fab labs, etc. Mais aussi aux événements réguliers: afpyros, open coffee, hack-a-thon, pycon, pyconfr, django cong, django breizh… Il y a souvent quelqu’un qui cherche un dev, ou connaît quelqu’un qui cherche un dev.

Quelques petits conseils pour maximiser vos chances

Je vous dis ça car j’ai été apprenti, employé, freelance, et chef d’entreprise, donc j’ai eu pas mal de points de vue sur la question.

Peut-être qu’il faudrait que je fasse un article complet sur réussir son entretien et son CV un de ces quatres.

10 excellentes séries peu connues

vendredi 5 octobre 2012 à 14:26

La gestion de crise à l’américaine, des femmes au foyer à la répartie et la libido surhumaine, des délires télévisuels sous LSD et des psychopathes adorables, … Il y a une vie après les block busters.

Better off Ted

Hilarant de cynisme léger, ses deux saisons mettent en scène le département de recherche et développement de la société Veridian Dynamics, monstre tentaculaire qui congèle ses collaborateurs, fait travailler les enfants de la garderies des employés et fabrique de la viande de bœuf sans vache, entre autre choses.

C’est drôle, pas sérieux pour deux sous, et aucun personnage n’est à jeté durant les courtes 20 minutes de chaque épisodes.

Psychoville

5 fous reçoivent une lettre avec écrit: “”Je sais ce que vous avez fait”. Un clown dégueulasse qui ne quitte jamais sont déguisement, un nain qui croit qu’il est télékinésique, un fils et sa mère débiles et violents, une infirmière qui nourrit une poupée avec du sang pour lui donner vie, et un collectionneur qui a vendu ses yeux pour poursuivre son hobby.

Cette flaque d’humour noir glauque et glissante prouve une fois de plus que les rosbifs sont toujours au top créativement parlant.

Dead like me

Belle, blonde et blasée: une peu morte à l’intérieur. La mauvaise nouvelle, c’est que Georgia va passer le reste de sa vie dans une cave à trier des papiers avec son air morose. La bonne, c’est que la fin de sa vie est à peu prêt dans 5 minutes. Tuée par des lunettes de WC tombant de la station Mir, elle devient une morte-vivante SDF suivant des ordres sur posts it. Si, si.

C’est lent. C’est tronqué à la saison 2. C’est très mystérieux. Mais qu’est-ce que c’est bon.

Sherlock

A part la très inattendue bonne surprise des films avec Robert Downey Jr, les adaptations à l’écran de Sherlock Holmes ont toujours été coup-ci coup-ça. Dites bonjour à un jeune Sherlock, méprisant, insupportable, détesté de tous, et parfaitement génial, qui s’est très bien adapté aux SMS.

On connaît l’histoire, mais la réa impeccable et l’excellent Benedict Cumberbatch font très vite accrocher à ces saisons de 3 épisodes d’une heure trente. Les personnages secondaires sont magistraux, avec une mention spéciale pour l’attaque des bijoux de la couronnes par Moriarty et son lecteur MP3 et l’introduction de The Woman à oulpé.

Pushing Daisies

Un pouvoir: deux règles. Ned peut ressusciter les morts en les touchant, mais si la résurrection dure plus d’une minute, une autre personne meurt au hasard. Et si il les retouche, ils retournent pour toujours à leur éternel repos. Ned doit maintenant caresser son chien avec une cuillère en bois et embrasser sa petite amie à travers un papier cellophane.

Si vous avez aimé Amélie Poulain, vous allez crier au chef d’œuvre. Petit bijoux d’esthétisme, chaque épisode peut être regardé plusieurs fois pour y trouver des centaines de détails. En prime, les personnages féminins ont des répliques fabuleuses.

Red Dwarf

Le vaisseau le Red Dwarf embarque l’équipage le plus nul du monde. C’est cheap, et pas forcément bien joué. Mais c’est sooooooooooooo Monthy Python. Et geek.

Firefly

Après Stargate, le monde de la série SciFi s’est écroulé. Battle Star Galactica a laissé quelques espoirs, mais le syndrome de Lost l’a très vite gagné. Puis j’ai découvert Firefly, ses personnages stéréotypés et son mélange science fiction / western. Et ça a pris. Je ne sais pas pourquoi. Mais ça a pris.

Difficile pour moi de vendre cette série. Elle n’a rien d’extraordinnaire. Mais elle m’a permit de me remettre de la déception de Farescape.

Oui, ils ont fait un film…

Misfits

Prenez 6 ados racailles condamnés aux travaux d’intérêt général. Donnez leur des pouvoirs arbitrairement, soudainement, sans leur ajouter ni morale, ni but dans la vie. Laissez mijotez dans un gettho britanique. Seule série de super héros sans aucun héros ou même personnage maîtrisant ses pouvoirs, Misfits brille par son ambiance unique, ainsi qu’une forte cohérence du scénario.

Combien de séries peuvent se venter de faire revenir un personnage dans le temps pour tuer Hitler, le laisser se faire mettre un coup de boule par Adolf, puis montrer comment l’Allemagne gagne la guerre grâce au téléphone portable du pauvre mec ?

Community

Il n’y a pas de scénario. Il n’y a pas de cohérence. Il n’y a pas de budget. Community est une série dans la lignée de Scrubs: des personnages caricaturaux dans un décors simple, des situations géniales et la volonté de donner un style à chaque morceau de saison. Un épisode est une partie de poker / paintball, un autre est entièrement en animation, un troisième est un huit-clos dans un simulateur spatial…

A prendre à dose régulière pour traiter la déprime, chaque prise vous apportera l’effervescence d’un sourir et la bonne humeur pour le reste de la journée. Six seasons and a movie !

Awake

Sam award de l’idée la plus cool. Le agent Michael Britten se plante en voiture avec son môme et sa femme. Il se réveille, son mioche est mort, sa femme est en vie, il va résoudre une enquête. Il se couche, sont fils est vivant, sa femme est dead, et il travaille sur une affaire différent mais étrangement liée. Dans chaque réalité, alternant un réveil sur deux, il va voir un psy qui lui assure que “ceci n’est pas un rêve”.

Le protagoniste le plus important est aussi le plus classe, et il vous entraîne dans son monde au rythme brumeux, mais tellement convainquant. Cette fois je suis sûr, c’est celle là la vraie vie. Ah non, merde, attend…

V.O required

Regarder ces séries en français n’est pas toujours possible, mais même dans le cas où ça l’est, je vais invite à l’éviter à tout prix. Certaines séries ne sont pas justes moins bonne une fois doublée, elles sont mauvaises. Mon pire souvenir ayant été, après avoir vécu en Angletterre, de retourner en France recommander Scrubs à mes amis pour m’entendre répondre que c’était affligeant. Et ils avaient raisons, Scrubs en français est une sombre merde qui ne mérite pas le temps de qui que ce soit.

Donc si vous ne pouvez pas les voir en V.O (au moins sous-titré), ne perdez pas votre temps, allez sur youporn.

Après on dit que je troll sur le monde de Ruby et de NodeJs

vendredi 5 octobre 2012 à 14:20

Je sais, je sais, tous les programmes ont des bugs. Je sais, ces outils sont super cool. Je sais, il faut se soutenir entre communautés et pas se tirer dans les pattes.

Mais merde, je voulais juste lancer la génération de mon fichier less pour le fabuleux bootstrap (juste publié par la plus grosse boîte qui utilise Ruby au monde, à savoir Twitter):

make
jshint: command not found

Ah ? C’est pas sur le site ça.

Ah nan c’est un bug, mais comme expliqué sur README, il faut juste installer jshint:

sudo npm install jshint -g
npm http 304 http://registry.npmjs.org/jshint

Ah, non. Ah mais c’est un bug de nodejs. C’est rien, il a été corrigé ! Il faut juste installer la dernière version.

sudo apt-get upgrade

Ah nan, aucune mise à jour.

Solution recommandée par les dev: compiler les sources. Youhou !

Je voulais juste

:-(

Réponse à l’article “Ruby -vs- Python” de Bodo Tasche

jeudi 4 octobre 2012 à 16:44

C’est pas encore vendredi, mais je ne  pouvais pas laisser passer ça. Petite réponse à Bodo Tasche, affûtez votre english car j’ai la flemme de traduire sa prose (si quelqu’un se propose, il aura droit à un tampon :-p).

Ruby and Python. Two languages. Two communities. Both have a similar target: to make software development better. Better than Java, better than PHP and better for everyone. But where is the difference? And what language is “better”? For the last question I can say: none is better. Both camps are awesome and do tons of great stuff. But for the first question the answer is longer. And I hope to provide that in this little article

Is the difference in the toolset around the language? No, I don’t think so. Both have good package managers, tons of libraries for all kind of stuff and a few decent web frameworks.

Heu… si. Il y a une énorme différence.

Ruby a RVM, un truc enorme et très difficile à mettre en oeuvre. Python a virtualenv, un truc léger et très simple à faire passer. Conséquence ? Une grande partie des rubistes n’utilisent pas RVM et leurs projets souffrent de problèmes constant de compatibilité. Combien de fois j’ai vu des gems install planter à cause de ça…

Et combien y a-t-il de RAD pour faire des applications en Ruby ? Ca influe sur le nombre d’applications desktop écrites en Ruby.

Combien y a-t-il d’outils pour facilement interfacer Ruby avec d’autres technologies ? Python est utilisé massivement comme langage d’extensions à cause de ça (Sublime Text, Blender, Nautilus, Inscape, etc).

Quant aux libs. On utilise Ruby pour quoi en dehors du Web ? Développement de jeu ? Sur tablette tactile ? Simulation scientifique ? Application desktop ? Très peu. Alors que Python est utilisé pour tout ça. La raison est justement le large panel de libs. Python a beaucoup, beaucoup, beaucoup plus de libs que Ruby.

Youhou ! Pour accéder à Internet, on utilise un ordinateur plein de trucs qui ne sont pas sur Internet ! Pour servir un site Web aussi !

L’écosystème, c’est la moitié de l’intérêt d’un langage. Je ne retire pas à Ruby le mérite de la qualité du sien: il est innovant, dynamique, sa communauté est fantastique. Mais on est loin d’avoir dans Ruby le dixième des outils et libs qu’on a en Python. C’est pour ça que Mac embarque embarquait Python par défaut et pas Ruby. C’est pour ça qu’Ubuntu est massivement codé en Python et pas en Ruby. Ca fait toute la différence.

I think there is something else that is way more important. The culture.

+ 1. Et Ruby en a une excellente. Faites un bisou aux gars de 37 signals.

Okay, now what is the difference in the culture? It is pretty easy. Python folks are really conservative and afraid of change, Ruby folks love the new shiny stuff even if it breaks older things. It’s that simple. But it has huge consequences.

Ce n’est pas la seule différence, mec. Les rubistes sont vachement plus sympa, d’une manière générale. Les pythonistes que je connais sont généralement assez blafards. Compétents, mais pas funny fun. Et les rubistes sont plus actifs socialement, du coup: plus d’events, plus d’articles de blog, plus de vidéos… Et ça, c’est un gros plus pour Ruby.

Mais d’un autre côté, Python a la culture des comptable: du code lisible, et de la documentation. Et comme c’est un peu mon job de lire le code 500 fois par jour et de fouiller dans la doc, c’est très important pour moi. Les docs Ruby, parfois, c’est vraiment une grosse blague. Regarder dans le code source n’est pas un bon palliatif. Une doc indique une manière officielle de faire, une manière figée, stable, qu’on va pouvoir utiliser et supporter sur des années. C’est important.

One you can see for example in the adaption of Ruby 1.9 vs Python 3. Both new versions did tons of breaking changes. A lot of code needed changes to run on the new plattform. In the Ruby world the transition went pretty quick. In the Python world it is very troublesome. Some Python people even say that Python 3 is broken and all energy should be focused on the 2.x-branch of the language. The Ruby community saw the opportunities. The Python community only saw the update problems. Yes, there have been update problems in the Ruby world, but we found an easy way to fix this: isitruby19.com. A simple plattform that showed if the gem is ready for 1.9. And if it wasn’t and the gem was important, it got fixed with pull requests or something similar. And the problems went away fast.

Ouai mais tu vois (tu me permet de te tutoyer ? en anglais on s’en fou de toute façon…), c’est vachement plus facile de tout péter quand on a pas deux OS majeurs qui se basent dessus. Je sais pas si tu as déjà essayé de faire upgrader un repo complet de milliers d’apps open sources, mais ça prend du temps.

Oh, et Python est là depuis vachement plus longtemps que Ruby. Python était même là avant Java. Chaque corps de métier à un sacret paquet de code à faire migrer, et ils sont pas tous en lean management super agile mega scrum mode, eux. Les biologistes qui utilisent Python pour faire leurs simulations depuis 10 ans, ils ont pas que ça à foutre d’upgrader leur code. Pour eux la prog, c’est pas “Fuck yeah, new features, I’m going to touch myself on Vx and migrate”. Pour eux c’est 7 ans de scripts d’analyse de génome à se retaper alors que ce n’est qu’un outil ennuyeux à leurs yeux.

Both models of thinking have pros and cons. The Python world is more stable, you can update your django installation without much troubles. But that also means new technology is only added very slowly. The Ruby world loves changes.

La différence majeur entre Rails et Django ? Rails: chaque version stable possède des gros trous qu’ils bouchent au fur et à mesure, parce que c’est pas grâve, on est flexible et adaptif mec, on release early et often. Django, en version 0.96, tout le monde l’utilisait déjà en production car le truc était rock solide.

Alors oui, y a moins de features. Mais ma plateforme ne m’explose pas à la gueule. Et pip installe fonctionne.

So much that most of the “new stuff” in the Python world was tested in the Ruby world first.

Ca c’est vrai. Merci d’ailleurs. Mais encore une fois, on parle d’une catégorie de libs qui se limitent au dev Web. C’est le même débat que “Mac est innovant”. C’est certain, quand on a une archi et 3 modèles à supporter, c’est plus facile de faire un truc innovant: on a pas à supporter de compatibilité.

We love changes so much that the Rails core is build around that idea. You can easily change nearly everything and extend everything. Most of the new stuff the Rails Core Team is testing right now for version 4 is available as plugin for Rails 3. This is pretty interesting if you love new things, love change, and love playing around with stuff. If you don’t and hate the idea of breaking changes, you maybe are better suited with the Python way. But don’t be afraid of breaking changes. They are all pretty well documented in the release guides. It’s not voodoo.

Si. C’est carrément du voodoo. Le monkey patching des objets built-in, c’est la porte ouverte à toutes les fenêtres, et quand deux libs le font en même temps, BOUM.

Et le nouveau, c’est marrant. Je suis pour le nouveau. Max m’engueule tout le temps car je veux essayer les trucs nouveaux. Mais pas instable. L’écosystème de Ruby est instable. Si les langages étaient des OS, Java serait Debian, Python serait Ubuntu LTS, Ruby serait Ubuntu RC. J’utilise la dernière Ubuntu pour mon desktop, parce qu’avoir Unity qui plante une fois par jour ne me dérange pas. Mais sur le serveur, je prends la version la plus stable, parce que j’ai pas besoin de <blink>, j’ai besoin de <strong>.

I for myself love the Ruby mindset. Something like Rails or Asset Pipelines or all the other things would not be possible if we are stuck with “no, don’t change that, it works pretty well that way”. Someone has to be the leader. Someone has to play around with new ideas. Yes, some ideas won’t fly, some are removed pretty quickly. But at least we tried them. Yes, I know that some people prefer the conservative way. If you consider yourself to be like that, you should at least try Python. I stay with Ruby.

C’est vrai qu’on ne fait rien d’innovant en Python: programmation du rasberry py, simulation neurale, facilitation du parsing d’arguments, création du meilleur protocole d’échange en P2P au monde… Ah, par innovation tu veux dire une énième lib Web ? Pardon, je croyais qu’on parlait de programmation au sens large du terme.

Dans ce cas: Twisted était là bien avant event-machine (ou même NodeJs). Wep.py était là avant Sinatra. Virtualenv était là avant RVM. Zope était là 6 ans avant ROR avec son ORM et son langage de template.

Et oui, vous avez bien amélioré tout ça. Et c’est génial. C’est comme ça que ce doit être. Mais arrêtez de vous prendre pour l’élément indispensable de l’innonvation de la programmation Web moderne. Vous n’êtes pas tous des Jason Fried. Et là plupart des choses que l’on fait aujourd’hui on été inventé par les mecs de Lisp, Haskel et Smalltalk de toute façon, qui eux même se sont inspirés de l’amont. On giant shoulders, tout ça, tout ça…