web-dev-qa-db-fra.com

Impossible de se connecter à la page d'administration Django avec un nom d'utilisateur et un mot de passe valides

Je ne peux pas me connecter à la page d’administration de Django. Lorsque je saisis un nom d'utilisateur et un mot de passe valides, la page de connexion s'affiche à nouveau, sans message d'erreur.

Cette question est dans le Django FAQ , mais j’ai passé en revue les réponses et ne peux toujours pas passer l’écran de connexion initial.

J'utilise Django 1.4 sur Ubuntu 12.04 avec Apache2 et modwsgi.

J'ai confirmé que j'enregistre l'administrateur dans le fichier admin.py, en veillant à synchroniser après l'ajout de INSTALLED_APPS. Lorsque je saisis un mot de passe incorrect, je _ {DO _ reçois une erreur. Mon utilisateur administrateur est donc en cours d'authentification mais ne passe pas à la page admin.

J'ai essayé de régler SESSION_COOKIE_DOMAIN sur l'IP de la machine et sur Aucun. (Confirmation que le domaine de cookie indique que l'adresse IP de la machine est chromée)

Vérifiez également que l’utilisateur s’authentifie via le shell:

>>> from Django.contrib.auth import authenticate
>>> u = authenticate(username="user", password="pass")
>>> u.is_staff
True
>>> u.is_superuser
True
>>> u.is_active 
True

Tentative de connexion utilisant IE8 et chrome Canary, les deux résultats entraînent le même retour à l'écran de connexion.

Y a-t-il autre chose qui me manque ????

settings.py

...
MIDDLEWARE_CLASSES = (
    'Django.middleware.gzip.GZipMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.middleware.transaction.TransactionMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
)
AUTHENTICATION_BACKENDS = ('Django.contrib.auth.backends.ModelBackend',)
INSTALLED_APPS = (
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.sites',
    'Django.contrib.messages',
    'Django.contrib.admin',    
    'Django.contrib.staticfiles',
    'Django.contrib.gis',
    'myapp.main',
)

SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_AGE = 86400 # sec
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_NAME = 'DSESSIONID'
SESSION_COOKIE_SECURE = False

urls.py

from Django.conf.urls.defaults import * #@UnusedWildImport
from Django.contrib.staticfiles.urls import staticfiles_urlpatterns
from Django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    (r'^bin/', include('myproject.main.urls')),    
    (r'^layer/r(?P<layer_id>\d+)/$', "myproject.layer.views.get_result_layer"),
    (r'^layer/b(?P<layer_id>\d+)/$', "myproject.layer.views.get_baseline_layer"),
    (r'^layer/c(?P<layer_id>\d+)/$', "myproject.layer.views.get_candidate_layer"),    
    (r'^layers/$', "myproject.layer.views.get_layer_definitions"),
    (r'^js/mapui.js$', "myproject.layer.views.view_mapjs"),
    (r'^tilestache/config/$', "myproject.layer.views.get_tilestache_cfg"),
    (r'^admin/', include(admin.site.urls)),  
    (r'^sites/', include("myproject.sites.urls")),  
    (r'^$', "myproject.layer.views.view_map"),
)


urlpatterns += staticfiles_urlpatterns()

Version Apache:

Apache/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 configured

Apache apache2/sites-available/default:

<VirtualHost *:80>
        ServerAdmin ironman@localhost
        DocumentRoot /var/www/bin
        LogLevel warn
        WSGIDaemonProcess lbs processes=2 maximum-requests=500 threads=1
        WSGIProcessGroup lbs
        WSGIScriptAlias / /var/www/bin/Apache/Django.wsgi
        Alias /static /var/www/lbs/static/
</VirtualHost>
<VirtualHost *:8080>
        ServerAdmin ironman@localhost
        DocumentRoot /var/www/bin
        LogLevel warn
        WSGIDaemonProcess tilestache processes=2 maximum-requests=500 threads=1
        WSGIProcessGroup tilestache
        WSGIScriptAlias / /var/www/bin/tileserver/tilestache.wsgi
</VirtualHost>

UPDATE

La page admin continue lorsque vous utilisez le serveur de développement via runserver. Cela ressemble donc à un problème wsgi/Apache. Je ne l'ai toujours pas compris.

SOLUTION

Le problème était que le fichier de paramètres SESSION_ENGINE avait la valeur 'Django.contrib.sessions.backends.cache'sans _ et que le CACHE_BACKEND était correctement configuré.

J'ai changé le SESSION_ENGINE en 'Django.contrib.sessions.backends.db' qui a résolu le problème.

38
monkut

Étapes pour déboguer:

  • Assurez-vous que votre base de données est synchronisée
    • Vérifiez que vous avez une table Django_session
  • Essayez de vous authentifier
    • Voyez-vous un enregistrement en cours de création dans la table Django_session?

SI NON

  • supprimer les paramètres non standard
    • AUTHENTICATION_BACKENDS = ('Django.contrib.auth.backends.ModelBackend',)
    • SESSION_EXPIRE_AT_BROWSER_CLOSE = True
    • SESSION_SAVE_EVERY_REQUEST = True
    • SESSION_COOKIE_AGE = 86400 # sec
    • SESSION_COOKIE_DOMAIN = Aucun
    • SESSION_COOKIE_NAME = 'DSESSIONID'
    • SESSION_COOKIE_SECURE = False
  • Assurez-vous que votre base de données est synchronisée
    • Vérifiez que vous avez une table Django_session
  • Essayez de vous authentifier
    • Voyez-vous un enregistrement en cours de création dans la table Django_session?

Faites-moi savoir si cela s'avère utile pour le débogage.

Exemple de fichier de paramètres: https://github.com/fyaconiello/Django-Blank-Bare-Bones-CMS/blob/master/dbbbcms/settings.py

47
Francis Yaconiello
>>> from Django.contrib.auth import authenticate
>>> u = authenticate(username="user", password="pass")
>>> u.is_staff True
>>> u.is_superuser True

Is there something else I'm missing????

u.is_active devrait être True

9
Burhan Khalid

Nous avons eu un problème similaire dans notre application et ceux-ci pourraient aider:

  1. Utilisez la commande de nettoyage pour effacer les sessions plus anciennes de Django_sessions

  2. Vérifiez la taille des cookies dans les outils de développement firefox (firebug) ou chrome. La messagerie étant activée par défaut dans admin (Django.contrib.messages.middleware.MessageMiddleware), la taille du cookie dépasse parfois 4096 octets avec plusieurs modifications et suppressions. Un test rapide consiste à supprimer le cookie "message" et à voir si vous pouvez vous connecter après cela.

Et nous avons finalement opté pour la route nginx/uwsgi à cause de cela et d’autres problèmes de mémoire liés à Apache. Je n'ai pas vu cela se répéter dans nginx depuis.

3
Raj J

cela ressemble à un problème de session car après le post, vous êtes redirigé et le système a immédiatement oublié que vous vous êtes connecté.

essayez ce qui suit:

  1. vérifiez que le backend de votre session fonctionne.
  2. échangez-le avec le backend du cache si vous utilisez le backend du cache de la base de données pour vérifier si le middleware de transaction dérange.
  3. essayez db backend et vérifiez s'il y a des sessions stockées dans la table db
2
frog32

Je ne crois pas que le mot de passe administrateur est stocké dans le fichier settings.py. Il a été créé lors de votre première synchronisation. Je pense que vous avez soit sauté la création du superutilisateur, soit créé une faute de frappe . Essayez de l’exécuter dans le terminal à la racine de votre projet:

python Django-admin.py crée un utilisateur supérieur

Cela vous permettra de retaper votre login administrateur. Voir aussi ici https://docs.djangoproject.com/en/dev/ref/Django-admin/

2
Kei Nagase

En vérifiant d’autres articles sur ce sujet, cela pourrait être lié à sys.path. Pouvez-vous vérifier et comparer sys.path lors de l'exécution du serveur dev et de WSGI.

Pour certains détails, regardez ceci et cet article . Mais je vérifierais d’abord le sys.path avant d’entrer dans les détails de cet article.

1
schacki

Vérifiez que vous avez au moins une site avec laquelle travailler. 

>>> from Django.contrib.sites.models import Site
>>> Site.objects.count()
(0.048) SELECT COUNT(*) FROM `Django_site`; args=()
1

Si vous voyez 0 ici, créez-en un.

1
Alexey Kachayev

J'ai eu ce problème. Le problème est qu'en production, j'ai défini deux variables sur True qui m'ont permis de me connecter au site en utilisant https.

SESSION_COOKIE_SECURE et CSRF_COOKIE_SECURE doivent être définis sur False si vous développez sur localhost http. La modification de ces deux variables en False m'a permis de me connecter au site d'administration lors du développement local.

1
Marquistador

Je ne suis pas tout à fait sûr, mais le problème pourrait venir de votre configuration d'URL, concrètement dans ces deux lignes:

(r'^admin/', include(admin.site.urls)),  
(r'^sites/', include("myproject.sites.urls")),

Il y a plus longtemps, j'avais des problèmes pour naviguer dans l'administration de mon projet Django, car une configuration d'URL unique remplaçait une partie de l'URL de l'administrateur. Il semble que Django n’aime pas cela lorsque vous spécifiez une configuration d’URL personnalisée contenant des éléments qui font également partie de l’URL d’administrateur. Dans votre cas, l'application Django.contrib.sites est activée dans votre settings.py. Vous pouvez accéder au panneau d'administration de cette application en allant à http://127.0.0.1:8000/admin/sites/. Il se peut que votre configuration d'URL avec r'^sites/' dans celle-ci remplace une partie de l'URL de l'administrateur. Essayez de renommer cette configuration d'URL spécifique ou désactivez Django.contrib.sites dans INSTALLED_APPS à des fins de test.

Veuillez noter qu'il ne s'agit que d'une hypothèse. Tout ce que je sais, c'est que le panneau d'administration de Django est un peu difficile en ce qui concerne les configurations d'URL utilisant des noms similaires, comme ses propres URL. Je ne peux pas le tester moi-même pour le moment. Mais peut-être que cela vous aide un peu.

1
pemistahl

Disclaimer: Je ne peux pas encore ajouter de commentaires, je dois donc demander une clarification en proposant une solution en même temps. Désolé.

L'utilisateur est-il déconnecté immédiatement après la connexion? quelque chose comme ce numéro

Vous pouvez le vérifier de différentes manières. Je suggère d’ajouter un crochet au signal de déconnexion (vous pouvez le mettre dans votre models.py):

from Django.contrib.auth.signals import user_logged_out

def alertme(sender, user, request, **kwargs):
    print ("USER LOGGED OUT!") #or more sophisticate logging

user_logged_out.connect(alertme)

puis essayez de vous connecter et vérifiez si le message apparaît dans votre console. S'il apparaît, vous devez alors vérifier si vous avez une redirection ou un modèle personnalisé en vous déconnectant après la connexion. J'espère que cela vous aidera à trouver le problème.

0
furins

Assurez-vous que votre table d'utilisateurs de base de données ayant l'entrée suivante est vraie:

is_staff  => True  (if exit).
is_active  => True .
is_superuser => True.
0
Dnyaneshwar Mahajan

J'ai eu le même problème et il vient d'être résolu après le redémarrage du serveur:

systemctl restart nginx
0
lapin

J'ai eu un problème connexe où j'essayais de me connecter et que la page serait suspendue avant que le socket ne soit tué. Il s'est avéré que j'étais effectivement connecté, mais l'un des processeurs de signal de connexion était gelé.

Le céleri n'a pas pu transmettre ses tâches asynchrones à RabbitMQ car le serveur RabbitMQ n'a pas pu démarrer.

0
kokociel

Avez-vous essayé en créant l'utilisateur avec:

python manage.py createsuperuser

J'ai le même problème lorsque je crée la base de données sur une machine de test et que je la migre vers le serveur de déploiement ...

0
Lapin-Blanc

Pour moi, je ne pouvais pas me connecter à la page d’administrateur de Firefox mais je pouvais me connecter à chrome . Le problème était que CSRF_COOKIE_PATH était défini dans mon fichier settings.py . Ne jamais l’utiliser. Cela ne fonctionne pas correctement sur Django 1.8.

0
max

Vous pouvez vous assurer que l'utilisateur créé a été signalé par Is_staff = True, j'oublie parfois de le signaler pour permettre aux utilisateurs de se connecter à l'administrateur Django.

0
Timothy