7
votes

Django Newbie: essayez d'inverser Auth.Views.Login dans Login_Required () Decorator

Je suis nouveau à Stackoverflow et à Django ...

Brève question (voir ci-dessous pour "Question longue"), le code suivant dans myApps / vues.py a échoué: xxx < / pré>

L'erreur est la suivante: xxx

'My-View2' est définie dans myApps / vues.py après mon-vue (et est référencé dans myProject / URLS .PY)

Je suppose qu'il y a quelque chose comme le poulet et l'œuf ici, mais je ne peux pas comprendre où je me trompe. J'essaie de configurer login_url dans des paramètres.py comme celui-ci avec la même erreur: xxx

Maintenant question (quel contexte, pourquoi je veux faire ça):

Travailler avec Django 1.3.1 J'ai eu la vue suivante, protégée avec auth.decorator: xxx

Ce décorateur de défaut Rediriger à / comptes / Connexion (cela fonctionne et ça Bien pour moi) PATH1 / Ceci est dû à la configuration Apache qui disent quelque chose comme: Wsgiscriptionnel / path1 /var/www/path/to/script.wsgioke/proxpe, et c'est bien pour moi.

Toutes les URL définies dans myProject / urls.py sont automatiquement relatives à ce nouveau Chemin, donc grâce à Django, tout mon site fonctionne sur cette nouvelle "racine HTML".

mais ma vue protégée redirige toujours sur My-Server: / comptes / login / à la place O My-Server: / PATH1 / COMPTES / Connexion

Jusqu'à présent, je le fais fonctionner à l'aide des paramètres.py xxx

ou en utilisant login_url Paramètre de "Login_Required" Decorator: xxx

mais je voudrais que cette vue de connexion soit relative à l'ensemble du chemin du site sans configurer "Path1" dans Apache et Django / Params.py

I Don 't sentit que d'utiliser inverse dans des paramètres.py est la bonne chose à faire ni l'utiliser dans un décorateur de vue. Mais jusqu'à présent, je ne sais pas comment gérer cela ...


1 commentaires

Avez-vous vraiment une vue définie comme My-View2 ? Ce n'est pas un nom python valide, - étant un opérateur. Si vous le faites, vous devez le renommer à My_View2 .


3 Réponses :


14
votes

Vous ne pouvez pas utiliser inverse code> dans le login_required code> décorateur ou dans paramètres.py code>, car la configuration URL n'a pas été chargée à Le temps que les paramètres / vues sont importés.

dans django 1.4+, vous pouvez utiliser Reverse_lazy code> . Sur les versions antérieures de Django, vous pouvez retourner Reverse_lazy CODE> ou voir ma réponse à la question Mappage d'URL inverse dans les paramètres . p>

dans django 1.5+, le paramètre login_url code> accepte les modèles d'URL nommés. Par exemple, si vous nommez votre modèle d'URL de connexion 'LOGIN', vous pouvez simplement faire: P>

LOGIN_URL = 'login' 


2 commentaires

Merci pour votre réponse précise! L'option que vous avez donnée est intéressante. Sachant que ce n'est pas possible dans la version 1.3.1 Je vais économiser du temps à essayer de le faire fonctionner!


Merci. J'ai couru dans ce numéro faisant mon propre décorateur et je devais m'assurer qu'il n'a pas forcé l'évaluation de inverse_lazy (...) trop tôt.



0
votes

Suite à la fonction Reverse (), je connais un autre moyen d'atteindre mon objectif:

Je vais bien avec l'utilisation d'URL standard (comptes / login, etc.) Je veux juste préparer la racine du document HTML qui n'est pas "/" dans mon cas.

de mon test, cela ne fonctionne pas dans les paramètres.py (c'est trop tôt à cette étape?)

dans mes vues.py: xxx

devient xxx


1 commentaires

Vous êtes à la hauteur de l'URL, cela enfreint le sec!



0
votes

Utiliser reverse_lazy ()

Documents Dites:

Il est utile que vous devez utiliser un renversement d'URL avant la charge de l'URLCONF de votre projet. Certains cas courants où cette fonction est nécessaire sont:

  • fournissant une URL inversée comme attribut URL d'une vue générique basée sur une classe.
  • fournissant une URL inversée à un décorateur (tel que l'argument login_url pour le django.contrib.auth.decorators.permission_requiked () décorateur).
  • Fournir une URL inversée en tant que valeur par défaut pour un paramètre dans la signature de la fonction.

0 commentaires