Django-fr

Forum

#1 02-10-2013 16:04:29

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Question sur le Cache Django

Bonjour,

J'envoie un grand nombre de données au format JSON (~= 6mo) que j'ai mis en cache, or pour améliorer encore les performances pour l'envoi de données j'envisage les choses suivantes :

1) J'ai mis en place un cache de type base de données avec un décorateur sur la vue que je cache. Voici ma config :

settings.py
CACHES = {
     'default': {
          'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
          'LOCATION': 'cacheTable',
     }  
}

views.py
@cache_page(60 * 15)
def eventJson(request):
      ......

Donc le cache de cette requête, si j'ai bien compris, sera réinitialisé toutes les 15 minutes lorsqu'un client refait une requête. Mon problème est que ladite requête est plutôt longue, donc le client qui devra faire la requête un quart d'heure plus tard va attendre des plombes. D'où ma question, est-il possible de programmer un calcul auto du cache tous les 15 minutes. Ou alors faire un job CRON qui fait une requête sur la page toutes les 15 minutes ? Mais cela me semble pas très propre...

2) Je souhaite compresser les données envoyées, que me conseillez-vous ? gzip ?

D'avance merci

Hors ligne

#2 05-10-2013 07:11:24

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Question sur le Cache Django

Bonjour,

La mise en cache via un cron me semble correct.
Le mieux dans ce cas est de se faire une commande qui traite tes données et les mets en cache (voir https://docs.djangoproject.com/fr/1.5/h … commands/)
En revanche, pour du cache, l'usage d'un backend comme memcache semble plus adapté quand c'est possible.

Si tu veux compresser les données, gzip semble un bon compromis.

Hors ligne

#3 15-10-2013 09:37:11

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Question sur le Cache Django

Bonjour,

Excusez moi pour ma réponse tardive (formation, etc...) , oui donc une tâche Cron vous semble correcte, par contre je ne sais pas comment m'y prendre.

1) soit je fait une tâche Cron qui exécute une requête http sur l'url de la vue.
2) soit je fait une tâche Cron qui recharge le cache de manière plus propre mais je ne sais pas comment faire.

si vous pouviez m'indiquer la procédure.. d'avance, merci

Hors ligne

#4 16-10-2013 07:55:11

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Question sur le Cache Django

Pour que cela fonctionne, il faudra déjà une configuration avec du cache partagé (memcache ou redis).
Ensuite, le cron pourra appeler Django via une simple commande (voir https://docs.djangoproject.com/fr/1.5/h … -commands/ pour la créer).

Hors ligne

#5 18-10-2013 09:28:21

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Question sur le Cache Django

Merci pour la réponse,

Mon problème c'est que je suis sur un serveur mutualisé et apparemment memcache est très difficile à configurer.
J'ai réfléchi au problème, voici une question plus précise :

Je souhaite que le cache soit permanent, c'est à dire qu'il soit réinitialisé uniquement lorsque je le décide. d'où ma question, est-il possible d'accéder au cache pour le réinitialiser en pointant sur une vue. Et ce en faisant autrement que lancer une requête http sur la vue, ce qui n'est pas le plus optimal à mon avis. Après je peux tout-à-fait faire un middleware qui lancerais une requête http sur modification d'un certain type d'objet...?

Qu'en pensez-vous ?

Hors ligne

#6 15-11-2013 04:19:28

artscoop
Membre
Inscription : 15-11-2013
Messages : 4

Re : Question sur le Cache Django

Bien sûr, il est possible de mettre indéfiniment en cache les données, ce que je conseille si les données sont longues à générer et qu'elles ne dépendent pas d'une requête d'utilisateur en particulier. Des données mises en cache indéfiniment (30 jours pour certains caches, je crois) peuvent également être réécrites, sans souci.

Une vue peut tout à fait réécrire le cache, il faut alors de préférence que cette vue ne soit pas connue d'un robot ou d'un crawler.
Un service cron (lançant un wget) ou un service cron web tiers pourra alors tirer sur l'URL de cette vue pour mettre à jour le cache, au rythme voulu.

Le choix de ne pas utiliser de vue est bien plus sûr (pas de risque que quelqu'un connaisse l'URL et crée un DoS en 4 requêtes), et je conseille à cet effet d'utiliser une tâche planifiée de Celery. La question est de savoir si Celery (et Redis, RabbitMQ ou d'autres) fonctionne sur un hébergement Python.

Hors ligne

#7 26-11-2013 08:29:05

EthPyth
Membre
Inscription : 22-08-2013
Messages : 7

Re : Question sur le Cache Django

Pour celery cela me paraît le plus adapté mais juste pour une mise en cache c'est peu etre un peu lourd à mettre en place. Puis il faut pouvoir installer redis s'il n'est pas sur le serveur... Si j'ai bien compris, l'hébergement te limite sur la configuration ?
Bref faut trouver un système plus simple que celery

Hors ligne

Pied de page des forums