2017-02-28 7 views
1

In einer letzten Codeänderung kann ich mich nicht mehr über/admin/oder meine Standard-Login-Seite einloggen, aber ich kann mich über eine Seite einloggen das leitet auf die Anmeldeseite um. Die Umleitung in Frage:Ich kann mich nicht bei Django-Admin anmelden, kann mich aber mit benutzerdefiniertem Formular anmelden

def show_calendar(request): 
    user = None 
    if request.method == "POST": 
     email = request.POST.get('email') 
     password = request.POST.get('password') 
     user = authenticate(email=email, password=password) 
     if user is not None: 
      login(request, user) 
     else: 
      return render(request, 'registration/login.html', {'error': 'Email and password not recognised. Please try again.'}) 
    if request.user.is_authenticated or user: 
     return render(request, 'calendar/full_calendar.html', {}) 
    return render(request, 'registration/login.html', {}) 

Die obige Ansicht funktioniert bei der Authentifizierung so. Wenn jedoch über die Anmeldungsseite oder/admin/ich einige Protokolle aus django.contrib.auth.authenticate anmelden und es scheint immer This backend doesn't accept these credentials as arguments. Try the next one. zu sein schlagen:

def authenticate(**credentials): 
    import logging 
    logging.basicConfig(filename='example.log', level=logging.DEBUG) 
    """ 
    If the given credentials are valid, return a User object. 
    """ 
    for backend, backend_path in _get_backends(return_tuples=True): 
     logging.debug(credentials) 
     try: 
      inspect.getcallargs(backend.authenticate, **credentials) 
     except TypeError: 
      logging.debug("This backend doesn't accept these credentials as arguments. Try the next one.") 
      # This backend doesn't accept these credentials as arguments. Try the next one. 
      continue 

credentials Protokolle wie: DEBUG:root:{'password': 'pass', 'username': '[email protected]'}

Relevante settings.py:

INSTALLED_APPS = [ 
    'myapp', 
    'dal', 
    'dal_select2', 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'blog', 
    'fullcalendar', 
    'crispy_forms', 
    'autoslug', 
    'storages', 
    'boto', 
    'django.contrib.sites', 
    'updown', 
    'stream_django', 
    'postman', 
] 

AUTHENTICATION_BACKENDS = ['myapp.CustomBackend.CustomBackend',] 

AUTH_USER_MODEL = 'myapp.User' 

myapp.User hat seine USERNAME_FIELD Set email

CustomBackend.py:

from django.contrib.auth.hashers import check_password 

from myapp.models import User 
from myapp import settings 
import logging 
logging.basicConfig(filename='example.log',level=logging.DEBUG) 


class CustomBackend(object): 

    def authenticate(self, username, password): 
     user = None 
     logging.debug("CUSTOM BACKEND AUTHENTICATE AUTHENTICATE") 
     try: 
      valid_user = User.objects.get(email=username) 
      if valid_user.check_password(password): 
       user = valid_user 
     except User.DoesNotExist: 
      pass 
     return user 


    def authenticate(self, email, password): 
     user = None 
     logging.debug("AUTHENTICATE") 
     try: 
      valid_user = User.objects.get(email=email) 
      if valid_user.check_password(password): 
       user = valid_user 
     except User.DoesNotExist: 
      pass 
     return user 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

Ich habe nicht in der Lage gewesen, den genauen Code Änderung festzunageln, die dieses Problem verursacht. Der einzige Unterschied ist, dass ich username und password in der Standard-Login-Seite und der Admin-Seite übergebe, während ich aus meiner Sicht die email und password holen. Sicherlich sollte die def authenticate(self, username, password): Methode korrekt verwendet werden, aber gemäß meinen Protokollen wird sie nie getroffen.

Antwort

0

Es sieht so aus, als ob Sie erwarten, dass die richtige authenticate-Methode basierend auf den Argumenten ausgewählt wird. In Python ersetzt jedoch Ihre zweite authenticate(self, email, password) Methode die erste authenticate(self, username, password):.

Es ist mir nicht klar, warum Sie ein benutzerdefiniertes Authentifizierungs-Back-End erstellt haben. Da Sie in Ihrem benutzerdefinierten Benutzermodell USERNAME_FIELD = 'email' haben, sollte das Standardmodell-Back-End mit der Standardanmeldeseite funktionieren. In Ihren benutzerdefinierten Ansichten ändern Sie den Code in authenticate(username=email, password=password). Ich würde jedoch vermeiden, Ansichten zu schreiben, die Benutzer dort eintragen, wo es möglich ist, um Fehler oder mögliche Sicherheitslücken zu vermeiden.

Anstatt Logins in der show_calendar Ansicht zu behandeln, würde ich stattdessen den login_required Dekorateur verwenden. Anonyme Benutzer werden auf die Anmeldeseite umgeleitet werden, umgeleitet dann auf die Ansicht zurück, nachdem sie sich angemeldet haben.

from django.contrib.auth.decorators import login_required 

@login_required 
def show_calendar(request): 
    return render(request, 'calendar/full_calendar.html', {}) 
+0

Mein Arsch noch einmal gerettet. Wird akzeptieren, wenn ich kann. Danke für die zusätzlichen Informationen –

0

Unter der Registerkarte Web in Ihrem pythonanywhere Login, nur die Datei wsgi Konfiguration überprüfen. Ein Beispiel für die Referenz ist wie folgt:

import os 
import sys 
path='/home/invinciblycool/my-first-blog/' 
if path not in sys.path: 
    sys.path.append(path) 
os.environ['DJANGO_SETTINGS_MODULE']= 'mysite.settings' 
from django.core.wsgi import get_wsgi_application 
from django.contrib.staticfiles.handlers import StaticFilesHandler 
application = StaticFilesHandler(get_wsgi_application()) 
Verwandte Themen