Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.
Например:
string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)
if (testString.Length == 0) // Throws a nullreferenceexception
{
//Do something
}
Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.
По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит
Дополнительная информация находится в C # NullReferenceException и Null Parameter .
from django.contrib.auth.models import User
from django.test import Client
user = User.objects.create(username='testuser', password='12345')
c = Client()
logged_in = c.login(username='testuser', password='12345')
В приведенном выше фрагменте, когда создан User
, фактический пароль хэш установлен в 12345
. Когда клиент вызывает метод login
, значение аргумента password
, 12345
передается через хэш-функцию, что приводит к чему-то вроде
hash('12345') = 'adkfh5lkad438....'
. Затем это сравнивается с хэш, хранящийся в базе данных, и клиенту отказано в доступе, потому что 'adkfh5lkad438....' != '12345'
Правильная вещь - вызвать функцию set_password
, которая передает данную строку через хеш-функцию и сохраняет результат в User.password
.
Кроме того, после вызова set_password
мы должны сохранить обновленный объект User
в базе данных:
user = User.objects.create(username='testuser')
user.set_password('12345')
user.save()
c = Client()
logged_in = c.login(username='testuser', password='12345')
Более простой способ - использовать force_login
, новый в Django 1.9.
force_login(user, backend=None)
Например:
class LoginView(TestCase):
def setUp(self):
self.client.force_login(User.objects.get_or_create(username='testuser')[0])
Если кто-то все еще следит за этим, я думаю, что атрибуты 'is_staff' и 'is_active' должны быть сохранены True для успешного входа в систему ......
self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)
is_staff
, который определяет, что доступ к административной панели вообще предоставляется. Как вы можете видеть, данные в начальной публикации уже имеют is_active = 1
, и это также значение по умолчанию для User.objects.create()
.
– jnns
14 November 2013 в 11:46
Убедитесь, что django.contrib.sessions
добавлен в INSTALLED_APPS
, потому что client.login()
проверяет, что он есть, и всегда будет возвращать false, если это не так:
https: //docs.djangoproject. ком / эс / 1.9 / темы / HTTP / сессии / # стимулирующей сессии
django.contrib.sessions.middleware.SessionMiddleware
в классах промежуточного программного обеспечения вы все равно не можете войти через django.test.Client. Мне понадобится неделя, чтобы найти этот ответ
– pupil
7 April 2016 в 05:29
Вы можете проверить, как показано ниже,
from django.test import TransactionTestCase, Client
class UserHistoryTest(TransactionTestCase):
self.user = User.objects.create(username='admin', password='pass@123', email='admin@admin.com')
self.client = Client() # May be you have missed this line
def test_history(self):
self.client.login(username=self.user.username, password='pass@123')
# get_history function having login_required decorator
response = self.client.post(reverse('get_history'), {'user_id': self.user.id})
self.assertEqual(response.status_code, 200)
Этот тестовый пример работал для меня.
User.objects.create_superuser()
иUser.objects.create_user()
, которые выполняют именно этот вызовset_password()
. – vdboor 12 April 2016 в 17:17User.objects.get_or_create()
выполняет требуемый вызовset_password()
– furins 28 March 2018 в 10:17