2017-10-20 5 views
0

Je suis un peu perplexe. Je veux vérifier si l'URL actuelle du site est dans un sous-ensemble spécifique de mes URLs. Quelle fonction de django ferait cela? Ceci est pour un intergiciel qui demande des informations supplémentaires avant de passer à une partie spécifique de mon site Web. Comment la liste d'exclusion doit-elle se rapporter aux URL définies dans urls.py?Comment vérifier l'URL actuelle dans la liste des URLs?

+1

La méthode [ 'resolve'] (https://docs.djangoproject.com/en/1.11/ref/urlresolvers/#resolve) prend un chemin d'URL et retourne la vue correspondante, mais on ne sait pas si c'est ce que tu veux. Votre question serait plus claire si vous donniez quelques exemples de vues et de modèles d'URL que vous souhaitez exclure. Êtes-vous sûr que vous voulez cette vérification dans middleware, et non un décorateur pour les vues restreintes? – Alasdair

+0

J'ai vérifié la résolution, mais je veux seulement un sous-ensemble des URL définies dans mon URL, par exemple. des applications spécifiques, publiques, et d'autres qui nécessitent une connexion supplémentaire. Vous avez raison avec le décorateur. Je pensais la mauvaise chose tout le temps. Au moment où j'ai créé le code ci-dessus, je pensais que les logiciels intermédiaires sont le seul endroit où vous pouvez rediriger vers une autre page avant que votre vue ne soit affichée. Mais ce n'est pas vrai. J'ai été capable de résoudre mon problème avec un bon décorateur. Je vous remercie. – Claude

+0

ma liste d'exclusion avait une liste de fonctions inverses et d'URL, mais elles échouaient pour les URL qui nécessitaient d'autres paramètres, comme les fonctions tokenisées, et les fonctions nécessitant des clés (réinitialisation du mot de passe, etc.). – Claude

Répondre

0

Ok, mon problème est essentiellement le résultat d'un mauvais design. Toute la question peut être résolue si j'utilise des décorateurs pour demander l'autorité pour les points de vue qui l'exigent. Quand j'ai écrit le code ci-dessus, je pensais que les middlewares seraient le seul endroit pour rediriger et appeler d'autres fonctions avant qu'une vue soit affichée, mais en fait, ils sont bons pour appliquer une fonction à toutes vos vues. Les décorateurs sont meilleurs si les fonctions ne s'appliquent qu'à un sous-ensemble de vues.

from django.core.urlresolvers import reverse, resolve 
from django.http import HttpResponseRedirect 


def project_required(func): 
    def decorated(request, *args, **kwargs): 
     if not request.session.get('authority'): 
      request.session['previous_url'] = resolve(request.path_info).url_name 
      return HttpResponseRedirect(reverse('project_login')) 
     return func(request, *args, **kwargs) 
    return decorated