我有一个看起来像这样的 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.client
是django.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/