在Django测试框架中使用基本HTTP访问身份验证

Hum*_*rey 45 python django unit-testing http-authentication django-testing

对于我的一些Django视图,我创建了一个执行基本HTTP访问身份验证的装饰器.但是,在Django中编写测试用例时,我花了一些时间来研究如何对视图进行身份验证.这就是我做到的.我希望有人觉得这很有用.

Hum*_*rey 68

我是这样做的:

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)
Run Code Online (Sandbox Code Playgroud)

注意:您还需要创建用户.

  • 如果你是操作unicode字符串(典型的例如:使用py3)你需要做一些像`base64.b64encode('username:password'.encode()).decode()`因为base64模块不处理unicode字符串. (5认同)
  • 为什么是 HTTP_AUTHORIZATION 而不是 Authorization ? (2认同)

Rya*_*ski 29

在您的Django TestCase中,您可以更新客户端默认值以包含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
Run Code Online (Sandbox Code Playgroud)

  • 这也可以使用“Client”对象的“credentials()”方法来更简洁地完成:“self.client.credentials(HTTP_AUTHORIZATION='Basic'+credentials)”(参见http://www.django) -rest-framework.org/api-guide/testing/#credentialskwargs)。 (2认同)

mar*_*che 6

对于 python3,您可以对username:password字符串进行 base64 编码:

base64.b64encode(b'username:password')
Run Code Online (Sandbox Code Playgroud)

这将返回字节,因此您需要将其转换为 ASCII 字符串.decode('ascii')

完整示例:

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)
Run Code Online (Sandbox Code Playgroud)