Как отправить имя пользователя: пароль на запрос app.get() unittest?

Это часть моего юнит-теста в Flask-RESTful.

self.app = application.app.test_client()
rv = self.app.get('api/v1.0/{0}'.format(ios_sync_timestamp))
eq_(rv.status_code,200)

В командной строке я мог использовать curl для отправки имени пользователя: пароля к сервису:

curl -d username:password http://localhost:5000/api/v1.0/1234567

Как мне добиться того же в моем модульном тесте get()?

Так как мои get/put/post требуют аутентификации, в противном случае тест не пройдёт.

3 ответа

Решение

Из RFC 1945, протокол передачи гипертекста - HTTP / 1.0

11.1 Базовая схема аутентификации

...

Чтобы получить авторизацию, клиент отправляет идентификатор пользователя и пароль, разделенные одним символом двоеточия (":"), внутри строки в кодировке base64 [5] в credentials.string.

...

Если пользовательский агент желает отправить идентификатор пользователя "Aladdin" и пароль "открыть сезам", он будет использовать следующее поле заголовка:

  Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Так что если вы действительно используете базовую аутентификацию http, вы можете решить, как показано ниже, хотя ваш curl использование предполагает какую-то другую схему аутентификации.

from base64 import b64encode

headers = {
    'Authorization': 'Basic ' + b64encode("{0}:{1}".format(username, password))
}

rv = self.app.get('api/v1.0/{0}'.format(ios_sync_timestamp), headers=headers)

Для Python 3 попробуйте следующий пример:

from base64 import b64encode
headers = {
    'Authorization': 'Basic %s' % b64encode(b"username:password").decode("ascii")
}

self.app.get("foo/", headers=headers)

Если вы хотите использовать динамические переменные для имени пользователя и пароля, попробуйте что-то вроде:

'Basic %s' % b64encode(bytes(username + ':' + password, "utf-8")).decode("ascii")

Смотрите также: Python, HTTPS GET с базовой аутентификацией

Альтернативное решение - весь кредит идет на Дуга Блэка

def request(self, method, url, auth=None, **kwargs):
    headers = kwargs.get('headers', {})
    if auth:
        headers['Authorization'] = 'Basic ' + base64.b64encode(auth[0] + ':' + auth[1])

    kwargs['headers'] = headers

    return self.app.open(url, method=method, **kwargs)

и затем используйте этот метод в своих тестах:

resp = self.request('GET', 'api/v1.0/{0}'.format(ios_sync_timestamp), auth=(username, password))
Другие вопросы по тегам