Тестовый клиент Django получает перенаправление 301 при доступе к URL-адресу

Я пишу юнит-тесты для представлений django. Я заметил, что одно из моих представлений возвращает код перенаправления 301, что не ожидается.
Вот мой файл views.py, упомянутый ранее.

def index(request):
    return render(request, 'index.html',
                  {'form': QueryForm()})

def query(request):
    if request.is_ajax():
        form = QueryForm(request.POST)
        return HttpResponse('valid')

Ниже находится urls.py.

urlpatterns = patterns('',
         url(r'^$', 'core.views.index'),
         url(r'^query/$', 'core.views.query')
         )

И юниттест, который потерпит неудачу.

def so_test(self):
    response = self.client.post('/')
    self.assertEquals(response.status_code, 200)

    response = self.client.post('/query', {})
    self.assertEquals(response.status_code, 200)

Мой вопрос: почему возвращается статус 301?


person Michał Klich    schedule 08.10.2012    source источник
comment
Какой из них возвращает 301? Это полный код?   -  person Daniel Roseman    schedule 08.10.2012
comment
@DanielRoseman Второй, извините, что неясно.   -  person Michał Klich    schedule 08.10.2012


Ответы (2)


Вы определили URL-адрес, который соответствует /query/, но вы тестируете /query. Django перенаправляет на URL с косой чертой в конце, потому что APPEND_SLASH=True в ваших настройках.

Вероятно, вы захотите изменить свой тест на:

response = self.client.post('/query/', {})
person Alasdair    schedule 08.10.2012

Для меня проблема заключалась в том, что я по ошибке запустил тесты с файлом setting.py, который имел SECURE_SSL_REDIRECT = True. Переход на SECURE_SSL_REDIRECT = False решил проблему.

Другой вариант — использовать client с secure=True, т.е.:

response = self.client.post('/query/', {}, secure=True)

что заставит клиент эмулировать HTTPS-запрос< /а>.

person asherbar    schedule 01.02.2019