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

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'”,这对于 session 是相同的。我如何测试它是否已经设置了一些变量并且设置了可能的 session 到期时间,即使我进行了重定向也是如此?

最佳答案

您无法从HttpResponseRedirect检索上下文变量。无论如何重定向,为什么要设置上下文变量都没有道理。

您当然应该能够在重定向后从 session 中获取变量。我已经在几个测试用例中做到了这一点。您如何在测试用例中声明 session 数据?

这就是我如何在重定向后声明 session 变量:

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

您的第一个 View 可以使用auth为当前消息创建一条消息,并让第二个 View 读取和删除它。像这样的东西:
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才能起作用。

关于django - 重定向后如何在Django中测试上下文和 session ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3619904/

10-16 12:47