Как я могу использовать обычную аутентификацию с django_webtest для доступа к среде Django REST?

У меня возникают проблемы с публикацией данных в некоторых представлениях, использующих Django REST framework в моих тестах. Я использую 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': '[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?


person Jashugan    schedule 05.01.2013    source источник


Ответы (1)


После работы над проблемой я обнаружил, что мне нужно передавать полные заголовки базовой аутентификации, а не только 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 другие разрешения, вы должны убедиться, что эти разрешения установлены правильно.

Я надеюсь, что это помогает кому-то.

person Jashugan    schedule 07.01.2013