Why isn't django.contrib.auth.authenticate() working here?

Theaetetus :

I'm writing a simple (for now) Django app. I'm having trouble with authentication: I'm trying to use all of the out-of-the-box components, and both in the app itself and in tests, I can't authenticate users. So, for example, here's a test that fails:

from django.conf import settings
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.test import TestCase

[...]

class UserTestCase(TestCase):
    def setUp(self):
        self.testu = User(username="thename", password="thepassword", first_name="thefirstname")
        self.testu.save()

    def testAuthenticate(self):
        u = authenticate(username="thename", password="thepassword")
        self.assertEqual(u.first_name, "thefirstname")

I get an AttributeError:

'NoneType' object has no attribute "first_name".

I think this is because authenticate() is returning None (representing that there is no such user).

This fails whether or not I include the line "self.testu.save()".

I have other tests that pass, so I don't think the problem is with the test infrastructure. I can successfully create users and retrieve their information from the database.

The only mention of User in models.py is:

from django.contrib.auth.models import User

I've read through a lot of documentation but can't figure out what's going on. Can anyone help? Thanks in advance.

Willem Van Onsem :

You can not create a User object with a password like that. The password needs to be hashed. Therefore, you should use the .set_password(..) method [Django-doc]:

class UserTestCase(TestCase):

    def setUp(self):
        self.testu = User(username="thename", first_name="thefirstname")
        self.testu.set_password("thepassword")
        self.testu.save()

    # …

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=336646&siteId=1