Django测试时从请求对象获取头部出现KeyError

1 投票
1 回答
1941 浏览
提问于 2025-04-18 17:27

我在测试时想确认一个视图的位置。文档上说:

你可以在响应对象上使用字典语法来查询HTTP头部中的任何设置值。例如,你可以通过response['Content-Type']来确定响应的内容类型。

但是,当我尝试使用时却遇到了键错误。请帮帮我。

测试:

def test_normal_rewardstore_usage(self):    
    logged_in = self.client.login(username=self.u1.username, password="psst")
    response = self.client.get(reverse('rewards:rewardstore'))
    location = "http://testserver%s" % (reverse('rewards:rewardpage', kwargs={'company':self.r1.company.slug, 'slug':self.r1.slug}))
    self.assertEqual(response.status_code, 200)
    self.assertEqual(response['Location'], location)

错误:

Traceback (most recent call last):
  File "/app/rewards/tests/test_views.py", line 58, in test_normal_rewardstore_usage
    self.assertEqual(response['Location'], location)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/http/response.py", line 189, in __getitem__
    return self._headers[header.lower()][1]
KeyError: 'location'

视图:

def RewardStore_Index(request, template='rewards/reward-store.html', page_template='rewards/rewards_page.html'):
    user = User.objects.get(pk=request.user.pk)
    contact = Contact.objects.get(user__pk=request.user.pk, is_active=True)
    if request.user.is_authenticated():
    a = Member.objects.get(pk=request.user.pk)
    a = a.account_verified
    rewards = Reward.objects.filter(country__iso=contact.get_country)
    else:
    a = False
    g = GeoIP()
    c = g.country(request.user)
    c = c['country_code']
    rewards = Reward.objects.filter(country__iso=c)
    context = {
    'targetuser': request.user,
        'rewards': rewards,
        'page_template': page_template,
        'email_authenticated': True if a else False,
    'notifications': NotificationMap.objects.filter(user__pk=request.user.pk, read=False).prefetch_related('notification', 'notification__users')
    }
    if request.is_ajax():
        template = page_template
    return render_to_response(
        template, context, context_instance=RequestContext(request))

1 个回答

0

在响应对象中可以看到的头信息会根据使用的服务器不同而有所变化(来源),所以如果你发现django的测试工具返回的头信息和生产环境中看到的不同,这并不奇怪。此外,Location头通常是用在重定向的响应中,而你现在是先确认收到了200状态码。你确定在这种情况下应该期待有Location头吗?

撰写回答