如何在重定向后测试Django中的上下文和会话?

Mar*_*oni 6 django

我有一个看起来像这样的观点:

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'))
Run Code Online (Sandbox Code Playgroud)

现在如果我使用上下文断言变量,我得到错误:"AttributeError:'HttpResponseRedirect'对象没有属性'context'"这对于会话来说是相同的.我如何测试它然后设置了一些变量并且即使我重定向也设置了可能的会话到期?

Man*_*dan 5

您无法从a检索上下文变量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'))
Run Code Online (Sandbox Code Playgroud)

Self.clientdjango.test.client.Client这种情况下的一个实例.

更新

(回应@Marconi的评论)这是重定向后向用户显示消息的一种方法.这几乎是从我对另一个问题的回答中逐字复制的.

您的第一个视图可以使用auth为当前创建消息,并读取第二个视图并将其删除.像这样的东西:

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 %}
Run Code Online (Sandbox Code Playgroud)

消息将保存到数据库中.这意味着即使重定向也可以访问它们.在渲染模板时会自动读取和删除它们.您将不得不使用RequestContext它来工作.