Comment faciliter la lecture de ses routes sous Pyramid ?

Je souhaite vous faire part de mes réflexions à propos de la déclaration de routes sous Pyramid.

Voici un extrait de la déclaration des routes du projet Bookie (Python based delicious.com replacement).

C'est un extrait du fichier bookie/routes.py :

config.add_route("home", "/")
config.add_route("dashboard", "/dashboard")

# auth routes
config.add_route("login", "login")
config.add_route("logout", "logout")
config.add_route("reset", "{username}/reset/{reset_key}")
config.add_route("signup", "signup")
config.add_route("signup_process", "signup_process")

# celery routes
config.add_route("celery_hourly_stats", "jobhourly")

# DELAPI Routes
config.add_route("del_post_add", "{username}/delapi/posts/add")
config.add_route("del_post_delete", "{username}/delapi/posts/delete")
config.add_route("del_post_get", "{username}/delapi/posts/get")
config.add_route("del_tag_complete", "{username}/delapi/tags/complete")

# bmark routes
config.add_route("bmark_recent", "recent")
config.add_route("bmark_recent_tags", "recent/*tags")

config.add_route("bmark_readable", "bmark/readable/{hash_id}")

# user based bmark routes
config.add_route("user_bmark_recent", "{username}/recent")
config.add_route("user_bmark_recent_tags", "{username}/recent/*tags")

config.add_route("user_bmark_edit", "{username}/edit/{hash_id}")
config.add_route("user_bmark_edit_error",
    "{username}/edit_error/{hash_id}")
config.add_route("user_bmark_new", "{username}/new")
config.add_route("user_bmark_new_error", "{username}/new_error")

# config.add_route("bmark_delete", "/bmark/delete")
# config.add_route("bmark_confirm_delete", "/bmark/confirm/delete/{bid}")

# tag related routes
config.add_route("tag_list", "tags")
config.add_route("tag_bmarks", "tags/*tags")

Voici maintenant la liste des fichiers présents dans le dossier views :

.
├── bcelery
├── __init__.py
├── lib
├── models
├── routes.py
├── routes.pyc
├── scripts
├── static
├── templates
├── tests
└── views               <=== ce dossier
    ├── accounts.py
    ├── api.py
    ├── auth.py
    ├── bmarks.py
    ├── delapi.py
    ├── exceptions.py
    ├── __init__.py
    ├── stats.py
    ├── tags.py
    └── utils.py

Maintenant, je vous pose les questions suivantes :

  • En lisant le code source ci-dessous, pouvez vous me dire où sont les fonctions qui gèrent les vues home et dashboard ?
config.add_route("home", "/")
config.add_route("dashboard", "/dashboard")
  • En lisant le code source ci-dessous, pouvez vous me dire où sont les fonctions qui gèrent les vues user_bmark_recent, user_bmark_recent_tags et user_bmark_edit ?
config.add_route("user_bmark_recent", "{username}/recent")
config.add_route("user_bmark_recent_tags", "{username}/recent/*tags")

config.add_route("user_bmark_edit", "{username}/edit/{hash_id}")

Il n'est pas possible de répondre à ces questions facilement… il faut soit ouvrir les fichiers dans le dossier views ou utiliser grep pour faire une recherche.

Dans ce code source, il n'y a que les commentaires au dessus des routes qui nous permettent d'avoir un indice du fichier où se trouvent les fonctions views.

Les chemins complets vers les fonctions views ne sont pas non plus visibles dans l'outil de debug de Pyramid :

Maintenant, voici une autre manière de déclarer ses routes :

config.add_route("home", "/")
config.add_view(name="home", view="bookie.views.home")

config.add_route("dashboard", "/dashboard")
config.add_view(name="dashboard", view="bookie.views.stats.dashboard")

# auth routes
config.add_route("login", "login")
config.add_view(name="login", view="bookie.views.auth.login")

config.add_route("logout", "logout")
config.add_view(name="logout", view="bookie.views.auth.logout")

config.add_route("reset", "{username}/reset/{reset_key}")
config.add_view(name="reset", view="bookie.views.auth.reset")

config.add_route("signup", "signup")
config.add_view(name="signup", view="bookie.views.auth.signup")

config.add_route("signup_process", "signup_process")
config.add_view(name="signup_process", view="bookie.views.auth.signup_process")

…

Ici, en utilisant une déclaration explicite config.add_view je sais directement où sont présentent les fonctions views.

Je trouve cette notation bien plus pratique pour une personne qui souhaite contribuer, comprendre rapidement la structure d'un projet Pyramid.

Qu'en pensez vous ? Quels sont vos pratiques pour faciliter la lecture de vos projets Pyramid ?

Read and Post Comments

Astuce pour filtrer ses propres visites dans Google Analytics

Pour ne pas fausser le nombre de visites de mes sites - c'est à dire des sites sur lesquels je suis en train de travailler, développer, rédiger du contenu - je cherchais une astuce pour que Google Analytics ne prenne pas en compte mes propres visites.

J'ai trouvé par exemple une solution qui constite à mettre en place un filtre sur les adresses IP que j'utilise. Cependant, cette solution ne me convient pas tout à fait. Je peux consulter mon site depuis divers accès… je n'ai pas envie d'ajouter toutes les adresses IP.

J'ai trouvé une autre solution qui me convient mieux :

  • je modifie le user-agent de mon navigateur, j'y ajoute un identifiant
  • dans les pages de mes sites, j'active le code Javacript de Google Analytics uniquement si le "User-Agent" ne contient pas l'identifiant que j'ai ajouté

Pour modifier la valeur de mon "User-Agent", j'utilise l'extension Firefox User Agent Switcher.

J'ai ajouté "stephane-klein" comme identifiant, ce qui me donne le résultat suivant :

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2;stephane-klein) Gecko/20100101
Firefox/10.0.2

Ensuite, au niveau de l'activation de Google Analytics dans mes pages webs, j'ai quelque chose comme ça :

if (navigator.userAgent.indexOf("stephane-klein") == -1) {
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-29999662-1']);
    _gaq.push(['_trackPageview']);

    (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
    'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
    })();
}

Certes, mon identifiant "stephane-klein" sera visible pour toutes mes visites sur tous les sites (bien que je peux switcher rapidement la valeur de mon "User-Agent") mais bon, je trouve cela pas bien grave. Il est aussi possible d'utiliser un identifiant qui n'a pas de sens, un UUID par exemple.

Read and Post Comments

Mes flux :