Как отправить имя пользователя: пароль для запроса unittest app.get()?
Это часть моего unit test в 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 для отправки имени пользователя: password в службу:
curl -d username:password http://localhost:5000/api/v1.0/1234567
Как мне достичь того же в моей unit test get()?
Поскольку мой запрос get/put/post требует аутентификации, иначе тест завершится с ошибкой.
Ответы
Ответ 1
Из RFC 1945, протокол передачи гипертекста - HTTP/1.0
11.1 Схема базовой аутентификации
...
Чтобы получить авторизацию, клиент отправляет идентификатор пользователя и пароль, разделенных одним символом двоеточия ( ":" ) в пределах base64 [5] закодированную строку в файле credentials.string.
...
Если пользовательский агент хочет отправить идентификатор пользователя "Aladdin" и пароль open sesame ", он будет использовать следующее поле заголовка:
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)
Ответ 2
Альтернативное решение - все зависит от Doug Black
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))
Ответ 3
Для 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 с базовой аутентификацией