Использование базовой аутентификации доступа HTTP в среде тестирования Django - PullRequest
44 голосов
/ 31 марта 2011

Для некоторых моих представлений Django я создал декоратор, который выполняет базовую аутентификацию доступа HTTP.Однако во время написания тестовых примеров в Django мне потребовалось некоторое время, чтобы понять, как выполнить аутентификацию в представлении.Вот как я это сделал.Я надеюсь, что кто-то найдет это полезным.

Ответы [ 5 ]

67 голосов
/ 31 марта 2011

Вот как я это сделал:

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)

Примечание. Вам также потребуется создать пользователя.

29 голосов
/ 01 февраля 2012

В вашем 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
2 голосов
/ 30 мая 2017

Для 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)
2 голосов
/ 31 марта 2011

Предполагая, что у меня есть форма для входа, я использую следующую технику для входа в систему через тестовую среду:

    client = Client()
    client.post('/login/', {'username': 'john.smith', 'password': 'secret'})

Затем я ношу client в других моих тестах, так как он уже аутентифицирован. Какой у вас вопрос к этому посту?

0 голосов
/ 30 октября 2014

Другой способ сделать это - обойти клиента Django () и использовать вместо него запросы.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...