Как проверить контекст и сессию в Django после перенаправления? - PullRequest
6 голосов
/ 01 сентября 2010

У меня есть вид, который выглядит следующим образом:

def login(request):
    ...
    # some variables has been set here
    ...
    if request.POST.get('remember_me', None):
        request.session.set_expiry(1209600) # 2 weeks
    return HttpResponseRedirect(reverse('dashboard'))

Теперь, если я утверждаю переменные, используя контекст, я получаю ошибку: «AttributeError:« HttpResponseRedirect »объект не имеет атрибута« context »»это то же самое для сессий.Как мне проверить, что некоторые переменные установлены и возможное время окончания сеанса установлено, даже если я перенаправлю?

Ответы [ 2 ]

5 голосов
/ 01 сентября 2010

Вы не можете получить переменные контекста из HttpResponseRedirect. Не имеет смысла устанавливать контекстные переменные, если вы все равно перенаправляете.

Вы, безусловно, должны иметь возможность выбирать переменные из сеанса после перенаправления. Я сделал это в нескольких моих тестовых случаях. Как вы утверждаете данные сеанса в тестовом примере?

Вот как я утверждаю переменные сеанса после перенаправления:

response = self.client.post(reverse('foo'))
self.assertRedirects(response, reverse('bar', args = ['baz']), 
        status_code = 302, target_status_code = 200)
self.assertEqual('value', self.client.session.get('key'))

Self.client в данном случае является экземпляром django.test.client.Client.

Обновление

(В ответ на комментарий @ Marconi ) Вот один из способов отображения сообщения пользователю после перенаправления. Это почти дословно скопировано из моего ответа в другой вопрос .

Ваш первый просмотр может создать сообщение для текущего с использованием аутентификации, а второй просмотр прочитает и удалит его. Примерно так:

def first_view(request, *args, **kwargs):
    # all goes well
    message = _("<message for user>")
    request.user.message_set.create(message = message)
    return redirect('second_view')

def second_view(request, *args, **kwargs):
    # Render page

# Template for second_view:
{% for message in messages %}
   ... 
{% endfor %}

Сообщения сохраняются в базе данных. Это означает, что вы можете получить к ним доступ даже после перенаправления. Они автоматически читаются и удаляются при рендеринге шаблона. Вам нужно будет использовать RequestContext, чтобы это работало.

1 голос
/ 01 сентября 2010

Что я сделал (специально для проверки сеанса), так это не использовал тестовый клиент Django, а создал свой собственный объект запроса-макета и передал его непосредственно в мое представление, например:

def test_method(self):
    class request(object):
        POST = {'dummy':'data'}
        class session:
            @staticmethod
            def set_expiry(nmbr):
                request.session.nmbr = nmbr

    views.login(request)
    self.assertEqual(request.session.nmbr, 1209600)

Другая опция может использовать аргумент follow = True при использовании тестового клиента Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...