[英]Using Basic HTTP access authentication in Django testing framework
For some of my Django views I've created a decorator that performs Basic HTTP access authentication.对于我的一些 Django 视图,我创建了一个执行基本 HTTP 访问身份验证的装饰器。 However, while writing test cases in Django, it took me a while to work out how to authenticate to the view.然而,在 Django 中编写测试用例时,我花了一段时间才弄清楚如何对视图进行身份验证。 Here's how I did it.这是我如何做到的。 I hope somebody finds this useful.我希望有人觉得这很有用。
Here's how I did it:这是我如何做到的:
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)
Note: You will also need to create a user.注意:您还需要创建一个用户。
In your Django TestCase you can update the client defaults to contain your HTTP basic auth credentials.在您的 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
For python3, you can base64-encode your username:password
string:对于python3,您可以对username:password
字符串进行base64编码:
base64.b64encode(b'username:password')
This returns bytes, so you need to transfer it into an ASCII string with .decode('ascii')
:这将返回字节,因此您需要使用.decode('ascii')
将其转换为 ASCII 字符串:
Complete example:完整示例:
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)
Assuming I have a login form, I use the following technique to login through the test framework:假设我有一个登录表单,我使用以下技术通过测试框架登录:
client = Client()
client.post('/login/', {'username': 'john.smith', 'password': 'secret'})
I then carry the client
around in my other tests since it's already authenticated.然后我在其他测试中携带client
,因为它已经过身份验证。 What is your question to this post?你对这篇文章有什么问题?
(python3) I'm using this in a test: (python3) 我在测试中使用它:
credentials_string = '%s:%s' % ('invalid', 'invalid')
credentials = base64.b64encode(credentials_string.encode())
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials.decode()
and the following in a view:以及以下内容:
import base64
[...]
type, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
auth = base64.b64decode(auth.strip()).decode()
Another way to do it is to bypass the Django Client() and use Requests instead.另一种方法是绕过 Django Client() 并使用 Requests 代替。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.