python - solicitar - ¿Cómo enviar un nombre de usuario: contraseña a la solicitud de apptest() de unittest?
programa de usuario y contraseña en python (3)
Esto es parte de mi prueba de unidad en 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)
Dentro de la línea de comando podría usar curl para enviar el nombre de usuario: contraseña al servicio:
curl -d username:password http://localhost:5000/api/v1.0/1234567
¿Cómo logro lo mismo dentro de get () de mi prueba unitaria?
Como mi get / put / post requiere autenticación, de lo contrario la prueba fallaría.
De RFC 1945, Protocolo de transferencia de hipertexto - HTTP / 1.0
11.1 Esquema básico de autenticación
...
Para recibir autorización, el cliente envía el ID de usuario y la contraseña, separados por un solo carácter de dos puntos (":") dentro de una cadena codificada en base64 [5] en credentials.string.
...
Si el agente de usuario desea enviar el ID de usuario "Aladdin" y la contraseña abrir el sésamo ", usaría el siguiente campo de encabezado:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Entonces, si realmente usas la autenticación HTTP básica, puedes solucionarlo a continuación, aunque tu uso de curl
sugiere algún otro esquema de autenticación.
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)
Para Python 3, pruebe el siguiente ejemplo:
from base64 import b64encode
headers = {
''Authorization'': ''Basic %s'' % b64encode(b"username:password").decode("ascii")
}
self.app.get("foo/", headers=headers)
Si desea usar variables dinámicas para nombre de usuario y contraseña, intente algo como:
''Basic %s'' % b64encode(bytes(username + '':'' + password, "utf-8")).decode("ascii")
Ver también: Python, HTTPS GET con autenticación básica
Una solución alternativa: todo el mérito recae en 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)
y luego usa este método en tus pruebas:
resp = self.request(''GET'', ''api/v1.0/{0}''.format(ios_sync_timestamp), auth=(username, password))