python - 如何使用带有 django_webtest 的基本身份验证来访问 Django REST 框架?

标签 python django-rest-framework django-webtest

我在将数据发布到某些在我的测试中使用 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/

相关文章:

python - 对于特殊文本来说,最好的 python 正则表达式是什么?

django - 动态更改序列化程序字段

python - 分析标签集的最佳方法?

django - 添加到Django的manytomany字段

Django 休息框架 : Pickle Response

django - 测试 Django 1-5 重置密码表单 - 如何生成测试 token ?

python - Django Views : When is request. data a dict vs a QueryDict?

django - 我可以使用 WebTest 添加不存在的字段以形成表单吗?

python - TensorFlow 服务 : Update model_config (add additional models) at runtime

python - 用 Python 发牌?