1

J'ai un site privé qui nécessite une connexion pour toutes les pages. Lorsqu'un utilisateur va modifier un enregistrement, je ne veux pas verrouiller l'enregistrement. Je veux garder le disque disponible pour les autres. J'ai conçu un système utilisant les appels AJAX à django en utilisant dajax/dajaxice pour obtenir la personne la plus récente et la date d'édition pour l'enregistrement. Si la modification la plus récente n'a pas été effectuée par l'utilisateur actuel, une boîte d'alerte avertit l'utilisateur qu'une autre personne a effectué une modification depuis l'ouverture de l'enregistrement et qu'elle doit actualiser la page pour obtenir la version la plus récente des données.Contourner SESSION_SAVE_ON_EVERY_REQUEST pour un appel AJAX ou une meilleure solution

Tout cela est très bien, et fonctionne parfaitement pour notre situation. J'ai une session chronométrant qui, quand expiré enverra l'utilisateur à une invite de connexion. Dans le cas où l'utilisateur laisse la page ouverte et quitte l'ordinateur, nous voulons protéger les données sensibles. Cela fonctionne également parfaitement. Mon problème est que lorsque l'appel AJAX est fait pour vérifier la version des données, pour voir si elle est changée, elle enregistre aussi la session, donc la session ne sera jamais expirée, peu importe combien de temps ils sont à la page sans surveillance.

Y at-il un moyen dans une vue de contourner le SESSION_SAVE_ON_EVERY_REQUEST, de sorte que seule cette requête ne déclenche pas une sauvegarde. Je sais que je peux enregistrer manuellement la session dans toutes les autres vues, mais cela semble être la mauvaise chose à faire. Je suppose que je peux être capable d'écrire un middleware qui vérifie la vue demandée et enregistre seulement la session si ce n'est pas cette vue, mais je ne suis pas sûr que ce soit la meilleure solution non plus.

Des suggestions?

Merci d'avance.

Répondre

1

Je suis à peu près certain que cela fonctionnera. J'ai ajouté CustomeMiddleWare à settings.py MIDDLEWARE_CLASSES. Également, désactivé la sauvegarde de session à chaque requête dans settings.py.

class CustomMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     if view_func.__module__ != "exclude.module" and view_func.__name__ != "excludeMethod": 
      request.session.save() 

Maintenant, le problème est que, en utilisant Dajaxice, le module et le nom viennent comme dajaxice_request. Maintenant, je ne sais pas comment obtenir la méthode demandée. J'ai essayé beaucoup de choses, mais je n'ai pas pu. Vous ne voulez pas pirater le code DajaxiceRequest, mais vous devrez peut-être le faire.

  • SOLUTION:

    commuté sur jQuery Ajax pour cette seule méthode. Créé une nouvelle entrée urls.py pour effectuer l'appel unique pour obtenir la version de l'enregistrement. Cela rend le view_func dans process_view disponible, donc je ne peux sauvegarder la session que sur des vues appelées autres que celle-ci. Woo Hoo! J'utilise toujours Dajaxice pour toutes les autres méthodes AJAX.

Questions connexes