10

To jest część mojego testu jednostkowego w Flask-RESTful.Jak wysłać nazwę użytkownika: hasło do żądania app.get() unittest?

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

W wierszu polecenia można używać curl wysłać użytkownik: hasło do usługi:

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

Jak mogę osiągnąć to samo w ciągu dostać moje jednostki testowej w()?

Ponieważ moje get/post/post wymagają uwierzytelnienia, w przeciwnym razie test zakończy się niepowodzeniem.

Odpowiedz

15

Od RFC 1945, Hypertext Transfer Protocol -- HTTP/1.0

11.1 Basic Authentication Scheme

...

Aby otrzymać zezwolenie, klient wysyła identyfikator użytkownika i hasło, oddzielone pojedynczym dwukropkiem (":") charakter , w ciągu base64 [5] zakodowany ciąg w credentials.string.

...

Jeśli agent użytkownik chce wysłać "Aladyn" i hasło Open Sesame”, byłoby użyć poniższego pola nagłówka User ID:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

Tak jeśli naprawdę używasz uwierzytelniania podstawowego http, możesz rozwiązać takie rozwiązanie, jak poniżej, chociaż twoje użycie sugeruje inny schemat uwierzytelniania:

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) 
+0

działa, dzięki pęczek. – Houman

2

Alternatywnym rozwiązaniem - Wszystko zasługa Douga Blacka

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) 

a następnie użyć tej metody w badaniach:

resp = self.request('GET', 'api/v1.0/{0}'.format(ios_sync_timestamp), auth=(username, password)) 
2

dla Pythona 3, wypróbuj następujący przykład:

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

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

Jeśli chcesz używać zmiennych dynamicznych dla nazwy użytkownika i hasła, spróbuj coś takiego:

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

Zobacz także: Python, HTTPS GET with basic authentication