59 votes

Utilisation de l'authentification d'accès HTTP de base dans le framework de test Django

Pour certaines de mes vues Django, j'ai créé un décorateur qui effectue une authentification d'accès HTTP de base. Cependant, lors de l'écriture des cas de test dans Django, il m'a fallu un certain temps pour comprendre comment m'authentifier auprès de la vue. Voici comment j'ai procédé. J'espère que quelqu'un trouvera cela utile.

89voto

Humphrey Points 1057

Voici comment j'ai procédé :

 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)

Remarque : Vous devrez également créer un utilisateur.

34voto

Ryan Nowakowski Points 404

Dans votre Django TestCase, vous pouvez mettre à jour les valeurs par défaut du client pour contenir vos informations d'authentification de base 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

8voto

markushinsche Points 576

Pour python3, vous pouvez encoder en base64 votre chaîne username:password

 base64.b64encode(b'username:password')

Cela renvoie des octets, vous devez donc le transférer dans une chaîne ASCII avec .decode('ascii') :

Exemple complet :

 import base64

from django.test import TestCase

class TestClass(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)

2voto

Thierry Lam Points 7888

En supposant que j'ai un formulaire de connexion, j'utilise la technique suivante pour me connecter via le framework de test :

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

Je transporte ensuite le client dans mes autres tests car il est déjà authentifié. Quelle est votre question à ce poste?

2voto

obotezat Points 31

(python3) J'utilise ceci dans un test :

 credentials_string = '%s:%s' % ('invalid', 'invalid')
credentials = base64.b64encode(credentials_string.encode())
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials.decode()

et ce qui suit dans une vue :

 import base64
[...]
type, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
auth = base64.b64decode(auth.strip()).decode()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X