2010-10-29 4 views
17

Je cherche à désactiver la création automatique de session dans Django pour certaines URL. J'ai/api/* et chaque client qui frappe cela obtient une nouvelle session Django. Existe-t-il un moyen d'ignorer certaines URL?Désactiver la création de session dans Django

Répondre

16

Une solution triviale à ceci est de faire distinguer votre serveur web entre les appels d'API et les appels réguliers, puis d'avoir deux instances WSGI différentes de votre application: une avec des sessions activées, l'autre avec des sessions désactivées. (Ceci est probablement beaucoup plus facile avec Nginx qu'avec Apache.)

Une alternative est d'hériter de SessionMiddleware, puis de modifier les fonctions de processus pour ignorer toutes les demandes correspondant à vos critères. Quelque chose comme:

from django.contrib.sessions.middleware import SessionMiddleware 

class MySessionMiddleware(SessionMiddleware): 
    def process_request(self, request): 
     if request.path_info[0:5] == '/api/': 
      return 
     super(MySessionMiddleware, self).process_request(request) 

    def process_response(self, request, response): 
     if request.path_info[0:5] == '/api/': 
      return response 
     return super(MySessionMiddleware, self).process_response(request, response) 

Et puis modifiez votre fichier de paramètre afin que MIDDLEWARE_CLASSES contient le chemin « MySessionMiddleware » et non "django.contrib.sessions.middleware.SessionMiddleware.

+2

Merci pour l'info. 1 mise en garde cependant. Si vous utilisez l'authentification django, le middleware de session est requis. Process_response doit également renvoyer la réponse. –

+2

Cela ressemble à ce dont j'avais besoin. Un conseil: Utilisez 'if reqest.path_info.startswith ('/ api /')' au lieu de découper la chaîne. –

+0

Est-ce que process_response ne doit pas renvoyer l'objet de réponse? def process_response (auto, demande, réponse): si request.path_info [0: 5] == '/ api /': réponse de retour super retour (MySessionMiddleware, auto) .process_response (demande, réponse) –

0

Il est également possible dans un middleware personnalisé, ou n'importe où ailleurs, de surcharger la méthode request.session.save avant que la réponse ne soit traitée dans SessionMiddleware, où la méthode est appelée.

request.session.save = lambda: None 

Trivial, fonctionne. L'avantage de cette approche, bien qu'il s'agisse d'un hack de facto, est que l'objet session est toujours accessible et peut être utilisé de la manière habituelle sans avoir besoin d'autres changements dans le code.

Questions connexes