"RecursionError: maximum recursion depth exceeded in comparison" podczas próby logowania

0

Witam,

Właśnie zabrałem się za wprowadzenie swojego własnego skromnego systemu logowania w aplikacji. Niestety proces kończy sie błędem jak w tytule.
Poniżej kod, który generuje ów błąd:

@csrf_exempt
def login(request, lang):
	if request.method == 'POST':
                #tutaj oczywiście miejsce na sprawdzenie wprowadzonych danych, ale to później
		username = request.POST.get('username')
		password = request.POST.get('password')
		user = authenticate(username=username, password=password)
		if user is not None:
			if user.is_active:
				login(request, user)
				return redirect('docelowy_url_po_udanej_próbie_logowania')
			else:
				return redirect('jakis_inny_url')
		else:
			return redirect('jeszcze_inny_url')
	else:
		return render(request, 'languages/login.html', {})

Co robię źle? Strona błędu wskazuje na funkcję login():

/localhost/htdocs/django/mysite/languages/views.py in login
		login(request, user) ...
▶ Local vars
1

Bo z funkcji login() wołasz... funkcje login() ? Może chciałeś zawołać coś innego? Szczególnie że nazwa parametrów na to wskazuje.

0

Fakt, uszło mojej uwadze to, że swój widok nazwałem tak samo jak wbudowaną funkcję służącą do zalogowania użytkownika. Tak więc domyślam się, że wystarczy przemianować widok. Sprawdzę jak to działa po południu. A celem jest oczywiście zalogowanie zarejestrowanego wcześniej użytkownika po wpisaniu loginu i hasła we własnym formularzu.

0

@twentieth w kontrolerze powinieneś mieć coś w stylu:

def login(request, lang):
    if userService.isAuthenticated(request):
        return render(cośtam)
    else
        return render(request, 'languages/login.html', {})

I tyle. Logika powinna być w osobnym miejscu a kontroler tylko mapuje URLe na widoki. To że zajmujesz się Django od miesiąca nie znaczy że masz to robić źle.

0

Czyli rozumiem, że pokazany przeze mnie w pierwszym poście widok "login" powinien tylko i wyłącznie wyświetlać odpowiedni szablon w zależności od tego, czy użytkownik jest zalogowany czy nie. Natomiast za przetwarzanie danych uzyskanych z formularza odpowiedzialna powinna już być inna funkcja. I rozumiem też, że ta funkcja powinna znajdować się w pliku views.py.

Dobrze rozumuję?

0

Źle. Na pewno nie powinna znajdować się w pliku views.py bo nie jest zwiazana z widokiem a z "logiką aplikacji".

0

Ok. Czyli powinienem utworzyć zupełnie nowy plik plik.py, który będzie pobierał żądanie POST z formularza logowania i je przetwarzał, tak?

0

No parametry z requestu możesz jeszcze wyciagnać w kontrolerze, ale już same operacje autentykacji, połączenie z bazą etc powinny być w innym miejscu. Lekcja na dziś: Model-View-Controller i Model-View-Presenter

0

Podsumowując temat:

Błąd widoczny w tytule spowodowany był nazwaniem widoku nazwą "login".

Dziekuję wszystkim za twórczą dyskusję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1