test framework python django unit-testing http-authentication django-testing

python - test django rest framework



Uso de autenticación de acceso HTTP básica en el marco de prueba de Django (5)

Así es como lo hice:

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)

Nota: También deberá crear un usuario.

Para algunas de mis vistas de Django, he creado un decorador que realiza la autenticación de acceso HTTP básico. Sin embargo, mientras escribía casos de prueba en Django, me llevó un tiempo averiguar cómo autenticar la vista. Así es como lo hice. Espero que alguien encuentre esto útil.


En su Django TestCase puede actualizar los valores predeterminados del cliente para que contengan sus credenciales de autenticación básica de 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


Otra forma de hacerlo es omitir el Cliente Django () y usar las Solicitudes en su lugar.

class MyTest(TestCase): def setUp(self): AUTH = requests.auth.HTTPBasicAuth("username", "password") def some_test(self): resp = requests.get(BASE_URL + ''endpoint/'', auth=AUTH) self.assertEqual(resp.status_code, 200)


Para python3, puede codificar64 base su username:password cadena de username:password :

base64.b64encode(b''username:password'')

Esto devuelve bytes, por lo que debe transferirlo a una cadena ASCII con .decode(''ascii'') :

Ejemplo completo:

import base64 from django.test import 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)


Suponiendo que tengo un formulario de inicio de sesión, utilizo la siguiente técnica para iniciar sesión en el marco de prueba:

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

Luego llevo al client en mis otras pruebas ya que ya está autenticado. ¿Cuál es tu pregunta para esta publicación?