我在将数据发布到某些在我的测试中使用 Django REST 框架的 View 时遇到问题。我正在使用 django_webtest 来测试我的用户 API。我遇到了以下代码的问题:
class UserApiTest(WebTest):
def setUp(self):
AdminFactory()
def test_accessing_user_list_shows_one_user(self):
user_list = self.app.get('/quickstart/users/', user='admin')
assert_that(user_list.json, has_entry('count', 1))
def test_posting_new_user_returns_url_for_user_detail(self):
post_data = {'username': 'john', 'email': 'john.doe@example.com'}
user_create = self.app.post('/quickstart/users/', post_data, user='admin')
url = 'http://localhost:80/quickstart/users/2/'
assert_that(user_create.json, has_entry('url', url))
问题是我在第二次测试运行时收到 CSRF 错误。查看 Django REST Framework 文档,我读到只有在使用基于 session 的身份验证时才会触发 CSRF 错误。所以,我想我会尝试基本身份验证,根据 Django 的文档,这只需要设置 REMOTE_USER
环境变量:
class UserApiTest(WebTest):
extra_environ = {'REMOTE_USER': 'admin'}
def setUp(self):
AdminFactory()
def test_accessing_user_list_shows_one_user(self):
user_list = self.app.get('/quickstart/users/')
assert_that(user_list.json, has_entry('count', 1))
def test_posting_new_user_returns_url_for_user_detail(self):
post_data = {'username': 'john', 'email': 'john.doe@example.com'}
user_create = self.app.post('/quickstart/users/', post_data)
url = 'http://localhost:80/quickstart/users/2/'
assert_that(user_create.json, has_entry('url', url))
这更糟糕,因为用户甚至没有被授权查看这些页面(即访问 URL 返回的 403)。
我的问题是:如何使用 django_webtest 正确设置基本身份验证?
最佳答案
解决该问题后,我发现我需要传递完整的基本身份验证 header ,而不仅仅是 REMOTE_USER
。这是因为 Django REST Framework 在其 BasicAuthentication
后端解析基本身份验证。
class UserApiTest(WebTest):
auth_password = base64.encodestring('admin:default').strip()
extra_environ = {
'AUTH_TYPE': 'Basic',
'HTTP_AUTHORIZATION': 'Basic {}'.format(auth_password),
'REMOTE_USER': 'admin'}
def setUp(self):
AdminFactory()
def test_accessing_user_list_shows_one_user(self):
user_list = self.app.get('/quickstart/users/')
assert_that(user_list.json, has_entry('count', 1))
def test_posting_new_user_returns_url_for_user_detail(self):
post_data = {'username': 'john', 'email': 'john.doe@example.com'}
user_create = self.app.post('/quickstart/users/', post_data)
url = 'http://localhost:80/quickstart/users/2/'
assert_that(user_create.json, has_entry('url', url))
此外,默认情况下,您应该确保您在测试中创建的任何用户都将 is_staff
标志设置为 yes。当然,如果您已将 Django REST 设置为具有不同的权限,则应确保正确设置了这些权限。
我希望这对某人有帮助。
关于python - 如何使用带有 django_webtest 的基本身份验证来访问 Django REST 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14169454/