2016-10-28 8 views
0

Dieses Problem ist ziemlich seltsam. Hier ist ein Stack-Trace:Django: ungebundene Methode is_authenticated() muss mit AbstractBaseUser-Instanz aufgerufen werden

Environment: 


Request Method: GET 
Request URL: http://localhost/en/dashboard 

Django Version: 1.9.6 
Python Version: 2.7.12 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django_mongoengine', 
'django_mongoengine.mongo_auth', 
'django_mongoengine.mongo_admin.sites', 
'django_mongoengine.mongo_admin', 
'django_adyen', 
'spiral_api', 
'rest_framework', 
'rest_framework_mongoengine', 
'spiral_admin', 
'rest_framework_docs') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.locale.LocaleMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'spiral_api.middlewares.BehalfUserMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'spiral_api.middlewares.AuthHeaderMiddleware') 



Traceback: 

File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    235.     response = middleware_method(request, response) 

File "/code/django_app/spiral_api/middlewares.py" in process_response 
    11.  def process_response(self, request, response): 

File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py" in inner 
    204.    self._setup() 

File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py" in _setup 
    351.   self._wrapped = self._setupfunc() 

File "/code/django_app/spiral_api/middlewares.py" in get_user 
    18.   user = get_user_middleware(request) 

Exception Type: TypeError at /en/dashboard 
Exception Value: unbound method is_authenticated() must be called with AbstractBaseUser instance as first argument (got nothing instead) 

Hier ist eine Middleware:

from functools import partial 

from django.contrib.auth.middleware import get_user as get_user_middleware 
from django.contrib.auth.models import AbstractBaseUser 
from django.utils.functional import SimpleLazyObject 

from spiral_api.models import SpiralUserProfile 


class AuthHeaderMiddleware(object): 
    def process_response(self, request, response): 
     response['is_login'] = int(request.user.is_active) if hasattr(request, 'user') else 0 
     return response 


class BehalfUserMiddleware(object): 
    def get_user(self, request): 
     user = get_user_middleware(request) 
     if user.is_authenticated(): 
      profile = SpiralUserProfile.objects.get(user=user) 
      return profile.behalf or user 
     else: 
      return user 

    def process_request(self, request): 
     assert hasattr(request, 'session'), (
      "The Django authentication middleware requires session middleware " 
      "to be installed. Edit your MIDDLEWARE_CLASSES setting to insert " 
      "'django.contrib.sessions.middleware.SessionMiddleware' before " 
      "'django.contrib.auth.middleware.AuthenticationMiddleware'." 
     ) 
     request.user = SimpleLazyObject(partial(self.get_user, request)) 
     request.behalf = SimpleLazyObject(lambda: get_user_middleware(request)) 

Leider Projekt ist nicht meins. Aus der Ausnahme sehen Sie, dass es auf die Funktion get_user_middleware() zeigt. Ich habe versucht, print dort hinzuzufügen, auch als sys.exit(), nichts funktioniert .. es scheint zu sein, es kommt nicht einmal zu dieser Funktion. Hier ist, wie Middleware-Setup in den Einstellungen aussieht:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    # 'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'spiral_api.middlewares.BehalfUserMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'spiral_api.middlewares.AuthHeaderMiddleware' 
) 

Auch ein Modell SpiralUserProfile ein Feld hat behalf die Referenz User zu modellieren. Ich bin völlig verwirrt, warum die Exception einen Fehler an einem Ort zeigt, an dem der Interpreter nicht einmal kommt? Wie kann ich dieses Problem lösen?

Versionen von requirements.txt:

nose==1.3.7 
pinocchio==0.4.2 
django_nose==1.4.4 
bjoern==1.4.3 
amqp==1.4.9 
anyjson==0.3.3 
apiclient==1.0.3 
billiard==3.3.0.23 
blinker==1.4 
build==1.0.2 
celery==3.1.23 
Django==1.9.6 
django-bootstrap3==7.0.1 
django-crispy-forms==1.6.0 
django-fanout==1.1.1 
django-filter==0.13.0 
git+https://github.com/MongoEngine/django-mongoengine 
django-redis==4.4.3 
django-rest-framework-mongoengine==3.3.0 
djangorestframework==3.3.3 
drfdocs==0.0.9 
EasyProcess==0.2.2 
fanout==1.2.0 
git+http://github.com/google/google-api-python-client/ 
gunicorn==19.3.0 
httplib2==0.9.2 
kombu==3.0.35 
mongodbforms==0.3 
mongoengine==0.10.6 
nltk==3.2.1 
oauth2==1.9.0.post1 
oauth2client==2.1.0 
oauthlib==1.1.2 
Pillow==3.2.0 
psycopg2==2.6 
pubcontrol==2.2.7 
pyasn1==0.1.9 
pyasn1-modules==0.0.8 
PyInvoice==0.1.7 
PyJWT==1.4.0 
pymongo==3.2.2 
python-openid==2.2.5 
pytz==2016.4 
PyVirtualDisplay==0.2 
qrcode==5.3 
qrplatba==0.3.4 
redis==2.10.5 
reportlab==3.3.0 
requests==2.10.0 
requests-oauthlib==0.6.1 
rsa==3.4.2 
selenium==2.53.2 
simplejson==3.8.2 
six==1.10.0 
uritemplate==0.6 
urllib3==1.15.1 
xvfbwrapper==0.2.8 
zope.dottedname==4.1.0 
pyPdf 
+0

ist dies die volle Stacktrace? – e4c5

Antwort

1

Ich bin nicht sicher, wie dies jemals gearbeitet, aber ich kann sehen, warum Sie diesen Fehler bekommen würde. In django-mongoengine/mongo_auth/models.py Ich sehe dies:

class BaseUser(object): 

    is_anonymous = AbstractBaseUser.is_anonymous 
    is_authenticated = AbstractBaseUser.is_authenticated 

class User(BaseUser, document.Document): 
    ... 

, die die Quelle des Fehlers zu sein scheint.

Sie können es durch Modifizieren diese Bibliothek funktioniert, so dass die User-Klasse direkt die Methoden implementiert:

class User(document.Document): 
    ... 
    def is_anonymous(self): 
     """ 
     Always returns False. This is a way of comparing User objects to 
     anonymous users. 
     """ 
     return False 

    def is_authenticated(self): 
     """ 
     Always return True. This is a way to tell if the user has been 
     authenticated in templates. 
     """ 
     return True 
+1

Es scheint, dass das django-mongoengine-Paket eine PR angenommen hat, die das Problem auf andere Weise behebt: https://github.com/MongoEngine/django-mongoengine/pull/77/files#diff-5a7b5fa78e5ae80551cc405fafe61e5bR45 –

Verwandte Themen