2013-01-05 39 views
3

我在将数据发布到在我的测试中使用Django REST框架的某些视图时遇到问题。我正在使用django_webtest来测试我的用户API。我遇到了以下代码的问题:如何使用基本身份验证与django_webtest来访问Django REST框架?

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': '[email protected]'} 
     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文档,我读到仅在使用基于会话的身份验证时触发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': '[email protected]'} 
     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的基本身份验证?

回答

4

处理完这个问题后,我发现我需要传递完整的基本身份验证标头,而不仅仅是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': '[email protected]'}  
     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设置为具有不同的权限,则应确保这些权限已正确设置。

我希望这可以帮助别人。

相关问题