web-dev-qa-db-fra.com

L'objet 'WSGIRequest' n'a pas d'attribut 'utilisateur' Django admin

Lorsque j'essaie d'accéder à la page d'administration, le message d'erreur suivant s'affiche:

System check identified no issues (0 silenced).
June 21, 2016 - 15:26:14
Django version 1.9.7, using settings 'librato_chart_sender_web.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Internal Server Error: /admin/
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/Django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Library/Python/2.7/site-packages/Django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Library/Python/2.7/site-packages/Django/contrib/admin/sites.py", line 265, in wrapper
    return self.admin_view(view, cacheable)(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django/utils/decorators.py", line 149, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django/views/decorators/cache.py", line 57, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django/contrib/admin/sites.py", line 233, in inner
    if not self.has_permission(request):
  File "/Library/Python/2.7/site-packages/Django/contrib/admin/sites.py", line 173, in has_permission
    return request.user.is_active and request.user.is_staff
AttributeError: 'WSGIRequest' object has no attribute 'user'
[21/Jun/2016 15:26:18] "GET /admin/ HTTP/1.1" 500 78473

Je suis assez nouveau dans Django ... mais j'ai suivi ce tutoriel: https://docs.djangoproject.com/fr/1.9/ref/contrib/admin/

Je n'ai pas de sites AdminSites et AdminModels personnalisés.

J'ai déjà googlé à propos de ce problème mais je ne peux toujours pas le résoudre en aucune façon. Pouvez vous aider?

voici mon settings.py:

"""
Django settings for librato_chart_sender_web project.

Generated by 'Django-admin startproject' using Django 1.11.dev20160523235928.

For more information on this file, see
https://docs.djangoproject.com/en/dev/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/dev/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*1@+=wzrqx^6$9z&@2@d8r(w$js+ktw45lv2skez(=kz+rwff_'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'Django.contrib.admin',
    'librato_chart_sender',
    'fontawesome',
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
]

MIDDLEWARE = [
    'Django.middleware.security.SecurityMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'librato_chart_sender_web.urls'

TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'librato_chart_sender/templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'Django.template.context_processors.debug',
                'Django.template.context_processors.request',
                'Django.contrib.auth.context_processors.auth',
                'Django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'librato_chart_sender_web.wsgi.application'


# Database
# https://docs.djangoproject.com/en/dev/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'Django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'Django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'Django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'Django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/dev/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'GMT'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/dev/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    ('css', 'librato_chart_sender/static/css'),
    ('js', 'librato_chart_sender/static/js'),
    ('fonts', 'librato_chart_sender/static/fonts'),
]

et admin.py:

from Django.contrib import admin
from .models import Configuration

# Register your models here.

admin.site.register(Configuration)
61
Gonçalo Correia

Pour résoudre cela, allez à settings.py où il y a un nouveau style MIDDLEWARE (introduit dans Django 1.10)

Changez cela en style ancien MIDDLEWARE_CLASSES

https://docs.djangoproject.com/fr/stable/topics/http/middleware/#upgrading-pre-Django-1-10-style-middleware

83
Sir Mbuki

J'ai trouvé la réponse. Le nom de la variable sur:

MIDDLEWARE = [
    'Django.middleware.security.SecurityMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
]

MIDDLEWARE est la configuration de nouveau style introduite dans Django 1.10. Changez le nom en MIDDLEWARE_CLASSES et maintenant cela fonctionne.

Alors maintenant, le code est:

MIDDLEWARE_CLASSES = [
    'Django.middleware.security.SecurityMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
]
66
Gonçalo Correia

Au cas où quelqu'un aurait ce problème avec Django 2.0, la configuration suivante avec le nouveau style MIDDLEWARE semble fonctionner ( docs here ):

MIDDLEWARE = [
    'Django.middleware.security.SecurityMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
]
35
kayoz

Si quelqu'un a le même problème dans Django 2.0.2 ou ultérieur,

juste mettre à jour

MIDDLEWARE_CLASSES = (
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.common.CommonMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
'Django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'Django.contrib.messages.middleware.MessageMiddleware',
'Django.middleware.clickjacking.XFrameOptionsMiddleware',
'Django.middleware.security.SecurityMiddleware',
)

avec

MIDDLEWARE = [
'Django.middleware.security.SecurityMiddleware',
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.common.CommonMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
'Django.contrib.messages.middleware.MessageMiddleware',
'Django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Cela a fonctionné pour moi car j'ai créé mon projet avec Django 1.0.x mais mis à jour plus tard à Django 2.0.2

Vous ne devez pas modifier MIDDLEWARE en MIDDLEWARE_CLASSES. Ce qui se passe ici est plus probable que vous avez créé l'application avec Django 1.10 et que vous l'exécutez maintenant avec la version 1.9 ou une version précédente.

Assurez-vous d'utiliser une version spécifique de Django (et de toutes les autres bibliothèques) afin que votre projet ne tombe pas en panne lors du déploiement ou de l'exécution sur des machines différentes.

Si vous avez une base de code stable, lancez simplement:

pip freeze > requirements.txt

Et ensuite, lors du déploiement ou de la configuration d'un nouvel env, il suffit de faire:

pip install -r requirements.txt

Vous devriez toujours envisager d'utiliser des versions fixes de vos bibliothèques (et, éventuellement, des envs virtuels), et lors de la mise à niveau des dépendances, testez chaque modification de version.

14
Jose Hidalgo

Ma solution était que mon Django ver. J'avais réinstallé la version 1.9 à la version 1.10 sans modifier MIDDLEWARE en MIDDLEWARE_CLASSES.

2
Yura Liashenko

Facile.....

Si vous avez choisi le code ailleurs (le projet moyen n'est pas créé sur votre ordinateur) ... il peut alors s'agir d'une configuration différente de MIDDLEWARE dans la configuration du fichier dans votre code ..... vous devez donc simplement remplacer ce MIDDLEWARE. de celui que votre Django produit (créez un projet jetable-> allez dans les fichiers de paramétrage ---> copiez cette partie MIDDLEWARE et collez-la dans le projet dans lequel vous obtenez une erreur).

1
brainLoop

J'ai eu une erreur similaire sur mon serveur de production et, grâce à la chapelure de Sentry, j'ai constaté que l'erreur qui se produisait avait trait à mes paramètres, en particulier à ALLOWED_HOSTS.

Django version 1.10.8 avec python 2.7.

Mes réglages précédents:

ALLOWED_HOSTS = ['0.0.0.0',
                 'beta.mydomain.co.uk',
                 'mydomain.co.uk',
                 'www.mydomain.co.uk',
                 'alpha.mydomain.co.uk']

Sentry Breadcrumbs capture d'écran: sentry breadcrumb screenshot

Après cela, j'ai regardé autour de moi et j'ai trouvé ceci:

Une valeur commençant par un point peut être utilisée comme caractère générique de sous-domaine: ".example.com" correspondra à example.com, www.example.com et à tout autre sous-domaine de example.com.

Lien vers documentation officielle de Django

Donc, mes réglages finaux qui ont résolu mon problème:

ALLOWED_HOSTS = ['0.0.0.0',
                 'mydomain.co.uk',
                 'www.mydomain.co.uk',
                 '.mydomain.co.uk']

J'espère que cela a été utile :)

0
Madox