mardi 25 novembre 2014

Monkey patching avec Django

Si vous avez deja utilisé Django vous avez surement utilisé le module User pour gérer vos utilisateurs! Et dans la plupart des cas vous avez ajouté une autre classe (ex: UserProfile) pour ajouter des champs supplementaires à vos utilisateurs, ou vous avez tout simplement ajouter une classe heritant de AbstractUser. 
Ce sont de bonne façons de proceder mais on se retrouve soit avec des tables supplémentaires (1ére option) soit à faire des ninjutsu supplémentaires pour avoir le même comportement qu'avec la classe User (2éme option).
On peut s'éviter tout ceci en faisant du monkey patching!

Monkey patching!

Traduit littéralement ça donne modification singe.. Je sais pas ce que ça veut dire hein!
Dans le monde du logiciel le monkey patching est une technique qui permet d'ajouter des fonctionnalités dans du code existant sans modifier le code source d'origine.

Sans plus tarder appliquons la à notre application django déjà existante.
On suppose que notre application fonctionne avec la classe User avec les champs par défaut et maintenant on veut gérer les photo de profils de nos utilisateurs

Dans le fichier models.py ajoutons les lignes suivantes

from django.contrib.auth.models import User
User.add_to_class('photo', models.ImageField(upload_to='avatars'), blank=True, null=True) 
Une fois qu'on lance les commandes:
python manage.py makemigrations
python manage.py migrate 
python manage.py syncdb
  
Notre base de données se voit modifié avec le champ photo qui est ajouté à la table User

On n'est pas limité qu'à ça on peut modifier les champs par defaut par exemple le champs email de User n'est pas unique on peut ajouter cette option ainsi:


User._meta.get_field('email')._unique = True
Puis on effectue les migrations et sync notre base de données

Une fois ces modifications effectuées on voudra avoir ces champs dans notre admin panel pour cela ajoutons ces lignes dans admin.py

from django.contrib.auth.admin import UserAdmin
UserAdmin.list_display += ('photo', )
UserAdmin.fieldsets[0][1]['fields'] +=  ('photo', )

Et voilà nous avons patchez notre application!
Cette technique presente des avantages mais aussi des inconvenients pas négligeables tels que la diminution de la lisibilité et de la  modularité du code, complexité du code... donc il ne faut pas l'utiliser juste parce que l'on peut le faire!

Dêpot github

jeudi 30 octobre 2014

pymanga! vos manga en local


Yataaaa

Ou sont les amateurs de manga ??
Ou sont les pythonistes ??

Tadaima!

Vous avez l'habitude de regardez les scans de vos mangas favoris ?
Vous les sauvegardez sur votre disque dur pour en faire une collection ?

Eh bien nous avons quelques choses pour vous !

On va faire ensemble un petit script qui va nous permettre de télécharger les scans de naruto, bleach ou One Piece etc.

Trêve de bavardage passons au sérieux !

On va faire un peu de web scraping en utilisant python et quelques librairies comme urllib2, beautifulsoup4 sur lesquels on a un peu écrit!

Avant de passer aux codes étudions d'abord la structure d'une page d'un manga prenons comme exemple http://mangareader.net/bleach/603

Deux parties nous intéressent sur cette page:
  • la liste déroulante, ayant comme id pageMenu, elle contient les adresses des différentes pages composant le chapitre et permet ainsi de naviguer entre eux.
  • l'image qu'on veux télécharger avec comme id img son attribut src correspond a L’URL de l'image

























On récupére le contenu de la page et on le parse en html avec beautifulSoup4. Pour récupérer cette portion de la page on utilise la fonction find avec l'id du select. Ensuite on parcours les 'option' pour récupérer le value de chacune d'elle correspondant à une URL. Toutes ces URLs sont enregistrées dans un array.






















Une fois obtenu on parcours chaque page et on récupère L’URL de l'image qu'on passe à urllib2 pour le télécharger.


















Une fois téléchargé on écrit le flux dans un fichier sauvegardé en local.






















Pour mettre un peu de sel on va ajouter la librairie optparse qui permet de passer les arguments saisis en ligne de commande à notre script. Ainsi on avec l'option -c ou --chapter on passera le numéro du chapitre a télécharger et avec -m ou --manga on passera le nom du manga qu'on veut télécharger

















Le reste du script est disponible sur notre dépôt  github vous pouvez le compléter étant donné qu'il reste des choses a améliorer et ainsi apporter votre contribution! open source quoi  ;) !



Référence:

  1. Le depôt
  2. BeautifulSoup4
  3. urllib2
  4. optparse


jeudi 23 octobre 2014

Beautiful soup, c'est de la soupe

Beautiful soup, si vous pensez gastronomie vous pouvez essayer cette combinaison: CTRL+W, sinon continuez la lecture.

Beautiful soup est encore une autre librairie python! oh oui que du python!

En fait c'est une librairie qui fait du 'web scraping'  B-)

Vous comprenez pas anglais? ok d'aprés wikipedia:
Le web scraping (parfois appelé Harvesting) est une technique d'extraction du contenu de sites Web, via un script ou un programme, dans le but de le transformer pour permettre son utilisation dans un autre contexte, par exemple le référencement.

Beautiful Soup est l'une des librairies python les plus populaires dans ce domaine. Elle permet en effet de parcourir, de rechercher, de modifier le contenu d'un document html ou xml.

Treve de bavardage on va parcourir sommairement quelques unes de ces fonctionnalités!

On commence par recuperer le code html d'un chapitre de bleach sur mangareader.net












On importe le module urllib2 (voir article) qui nous permet de recuperer le contenu html de la page demandée.
Le contenu recuperé est passé en argument à la classe BeautifulSoup(BS) avec l'option 'html' pour lui preciser qu'on veut traiter du html. Le code html est converti en unicode et affecté à soupe.
























Ci-dessus on parcours notre document html en utilisant les tags de ce dernier et quelques fonctions supplementaires tel que find ou find_all qui permettent de trouver facilement un élément donné. On peut leur passer comme argument un identifiant ou un autre tag.

soupe.find(id='mangainfo') # retourne l'élément ayant comme id mangainfo
soupe.find_all('img') # retourne tous les tags img de la page

A noter qu'il y a aussi des fonctions comme find_next_sibling et find_previous_sibling qui me rappelle mes cours de xml :( ...


Bon on peut s'en arreter là pour aujourdh'hui. Ce petit post était une anticipation de notre prochain article qui va porter sur.... les mangas! Ben oui, on a un module qui nous permet d'extraire les URLs des pages de nos scans et un autre qui permet de les telecharger pourquoi pas combiner tous ça pour télécharger automatiquement nos mangas préferés et les avoir en local? Rendez-vous au  prochain article! A bientot!

Ah j'oubliais, n'hesitez pas de poser vos questions!



mardi 21 octobre 2014

Urllib2 a useful python library!

Hello guyz!

Pour notre premier article nous allons vous présentez un petit module python urllib2

What is urllib2?

Urllib2 est un module python qui nous permet d'effectuer des requetes HTTP! Il peut etre etendue afin de supporter d'autres protocoles.

Ah tiens c'est la v2 de urllib?

Non non et non!

 Urllib et urllib2 sont deux modules différents qui permettent de faire basiquement la meme chose!

 Donc je peux utiliser celui que je veux?

Non, on dira plutot que ces modules sont complémentaires puisque l'un permet des actions que l'autre ne permet pas:
  • urllib n'accepte qu'une URL comme parametre
  • urllib2 peut prendre un objet Request afin de modifier le header d'une requete

 urllib possede une fonction urlencode qui permet d'ajouter des parametres a une requete de type GET c'est la raison pour laquelle il est combine avec urllib2
 


Urllib2 peut être utilisé pour télécharger des fichiers aussi. Jetons un coup d'oeil à cet exemple:


Urllib2 Request

Request est un objet representant une requete HTTP. Il prend comme parametre une url et des data(optionnelement). En l'absence de data la requete est de type GET.



Et voila on s'arrete la pour aujourd'hui!
Urllib2 peut permettre encore beaucoup d'autres choses lisez la documentation pour en savoir plus ou posez vos questions on essaiera d'y reponde.

Sayonara!


References:
  1. urllib
  2. urllib2
  3. le code source de l'app

Contact

Nom

E-mail *

Message *