• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tworzenie testów dla funkcji logowania

Object Storage Arubacloud
0 głosów
224 wizyt
pytanie zadane 22 października 2018 w Python przez Sheida Użytkownik (950 p.)
edycja 22 października 2018 przez Sheida

Witam. Napisałem widok logowania w django na podstawie własnego modelu backendu. Chciałem, aby zamiast nazwy użytkownika podawać adres e-mail. W praktyce działa, chciałbym teraz napisać test dla funkcji logowania.

Kod testu:

    def test_login_form(self):
        from .models import User
        from django.contrib import auth
        username = 'Test'
        email = 'test@test.com'
        password = 'TestPassword'
        business = True

        user = User(username=username, email=email, password=password, business=business)
        user.save()
        login_user = auth.authenticate(username=email, password=password)
        self.assertTrue(login_user)

Funkcja auth.authenticate nie zwraca jednak użytkownika. Czy test jest napisany nieprawidłowo?

Celowo nie wrzucam kodu widoku oraz modelu backendu, te działają poprawnie. Gdyby jednak zaszła potrzeba, napiszcie proszę w komentarzu.

 

Model backendu:
 

class EmailBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

Widok logowania:

def login(request):
    template = loader.get_template('login/index.htm')
    if request.method == 'POST':
        user = auth.authenticate(username=request.POST['email'],
                                 password=request.POST['password'])
        if user is not None:
            auth.login(request, user)
            return redirect('main_page')

        messages.error(request, 'Nieprawidłowy e-mail lub hasło')
        return HttpResponse(template.render({}, request))
    else:
        return HttpResponse(template.render({}, request))

 

komentarz 22 października 2018 przez adrian17 Ekspert (344,860 p.)
Mógłbyś pokazać ten model?
komentarz 22 października 2018 przez Sheida Użytkownik (950 p.)
Na życzenie dodałem.

1 odpowiedź

+1 głos
odpowiedź 22 października 2018 przez adrian17 Ekspert (344,860 p.)
wybrane 22 października 2018 przez Sheida
 
Najlepsza

W sumie to nie wiem... natomiast mam wrażenie, że wbudowane authenticate() ma już taką funkcjonalność, bez konieczności pisania własnego backendu. Konkretnie:

https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#django.contrib.auth.models.CustomUser.USERNAME_FIELD

A string describing the name of the field on the user model that is used as the unique identifier. This will usually be a username of some kind, but it can also be an email address, or any other unique identifier.

Dokumentacja authenticate() mówi:

Tries to authenticate username with password by calling User.check_password. If no username is provided, it tries to fetch a username from kwargs using the key CustomUser.USERNAME_FIELD

(BTW, Twój test nazywa się "test_login_form", ale testuje tylko funkcję backendową, a nie model/formularz)

komentarz 22 października 2018 przez Sheida Użytkownik (950 p.)
Model backendowy jest zaczerpnięty ze StackOverflow,
https://stackoverflow.com/questions/37332190/django-login-with-email

dlatego nie wydaje mi się, że authenicate ma już taką funkcjonalność.

Co do nazwy testu, dzięki, przeoczenie z mojej strony.
komentarz 22 października 2018 przez adrian17 Ekspert (344,860 p.)
Zauważ, pod "zaakceptowaną" jest druga, nowsza odpowiedź, sugerująca właśnie USERNAME_FIELD :)
komentarz 22 października 2018 przez Sheida Użytkownik (950 p.)
Masz rację, zadziałało. Dziękuję za pomoc, denerwowałem się już tym trochę. :D

Podobne pytania

0 głosów
2 odpowiedzi 237 wizyt
pytanie zadane 18 listopada 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
1 odpowiedź 254 wizyt
pytanie zadane 12 listopada 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
2 odpowiedzi 3,098 wizyt
pytanie zadane 28 października 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...