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

时间:2010-09-01 15:54:33

标签: 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'))

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

2 个答案:

答案 0 :(得分:5)

您无法从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.clientdjango.test.client.Client的一个实例。

<强>更新

(响应@Marconi的评论)以下是重定向后向用户显示消息的一种方法。这几乎是从我的answer逐字复制到另一个question

您的第一个视图可以使用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 %}

消息将保存到数据库中。这意味着即使重定向也可以访问它们。在渲染模板时会自动读取和删除它们。您必须使用RequestContext才能实现此目的。

答案 1 :(得分:1)

我所做的(专门用于检查会话)是不使用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)

使用Django的测试客户端时,另一个选项可能是使用“follow = True”参数。