Для некоторых из моих представлений Django я создал декоратор, который выполняет аутентификацию основного HTTP-доступа. Тем не менее, при написании тестовых примеров в Django мне потребовалось некоторое время, чтобы выяснить, как аутентифицироваться в представлении. Вот как я это сделал. Надеюсь, кто-то найдет это полезным.
Использование базовой проверки подлинности HTTP в среде тестирования Django
Ответ 1
Вот как я это сделал:
from django.test import Client
import base64
auth_headers = {
'HTTP_AUTHORIZATION': 'Basic ' + base64.b64encode('username:password'),
}
c = Client()
response = c.get('/my-protected-url/', **auth_headers)
Примечание. Вам также потребуется создать пользователя.
Ответ 2
В Django TestCase вы можете обновить настройки по умолчанию для клиента, чтобы они содержали ваши основные учетные данные HTTP.
import base64
from django.test import TestCase
class TestMyStuff(TestCase):
def setUp(self):
credentials = base64.b64encode('username:password')
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials
Ответ 3
Предполагая, что у меня есть форма входа, я использую следующую технику для входа в тестовую среду:
client = Client()
client.post('/login/', {'username': 'john.smith', 'password': 'secret'})
Затем я переношу client
в другие мои тесты, так как он уже прошел проверку подлинности. Каков ваш вопрос к этому сообщению?
Ответ 4
Для python3 вы можете base64-кодировать строку username:password
:
base64.b64encode(b'username:password')
Это возвращает байты, поэтому вам нужно перенести его в строку ASCII с помощью .decode('ascii')
:
Полный пример:
import base64
from django.test import TestCase
def test_authorized(self):
headers = {
'HTTP_AUTHORIZATION': 'Basic ' + base64.b64encode(b'username:password').decode("ascii")
}
response = self.client.get('/', **headers)
self.assertEqual(response.status_code, 200)
Ответ 5
(python3) Я использую это в тесте:
credentials_string = '%s:%s' % ('invalid', 'invalid')
credentials = base64.b64encode(credentials_string.encode())
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials.decode()
и следующее в представлении:
import base64
[...]
type, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
auth = base64.b64decode(auth.strip()).decode()
Ответ 6
Другой способ сделать это - обойти Django Client() и вместо этого использовать запросы.
class MyTest(TestCase):
def setUp(self):
AUTH = requests.auth.HTTPBasicAuth("username", "password")
def some_test(self):
resp = requests.get(BASE_URL + 'endpoint/', auth=AUTH)
self.assertEqual(resp.status_code, 200)