在Django测试框架中使用基本HTTP访问认证

62 投票
6 回答
27792 浏览
提问于 2025-04-16 14:47

在我的一些Django视图中,我创建了一个装饰器,用来进行基本的HTTP访问认证。不过,在写Django的测试用例时,我花了一些时间才弄明白怎么给视图进行认证。下面是我找到的方法,希望对某些人有帮助。

6 个回答

8

对于Python3,你可以把你的 用户名:密码 字符串进行base64编码:

base64.b64encode(b'username:password')

这样会返回字节数据,所以你需要用 .decode('ascii') 把它转换成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)
34

在你的Django测试案例中,你可以更新客户端的默认设置,让它包含你的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
94

这是我怎么做的:

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)

注意:你还需要创建一个用户。

撰写回答