Python Django,测试重定向到外部页面

Python Django,测试重定向到外部页面,python,django,django-testing,django-tests,Python,Django,Django Testing,Django Tests,我在Django应用程序中有一个路由规则,用于重定向到外部CDN的下载。我现在正在为我的应用程序编写测试,我想测试路由是否成功重定向到Django设置中配置的url。下面是一个简化的示例,可以帮助解释我要做的事情: from django.test import SimpleTestCase from django.test.client import Client from django.conf import settings class MyTestCase(SimpleTestCase

我在Django应用程序中有一个路由规则,用于重定向到外部CDN的下载。我现在正在为我的应用程序编写测试,我想测试路由是否成功重定向到Django设置中配置的url。下面是一个简化的示例,可以帮助解释我要做的事情:

from django.test import SimpleTestCase
from django.test.client import Client
from django.conf import settings

class MyTestCase(SimpleTestCase):
    def setUp(self):
        self.client = Client()
    def test_download(self):
        response = self.client.get('/download/mac/')
        self.assertRedirects(response, settings.URLS.get('mac'))
现在这不起作用了,重定向得到了404,即使当我打印settings.DOWNLOAD\u URL时,用这种方法它是正确的,并且复制/粘贴到浏览器中证明它是有效的。我开始研究它为什么不起作用,我在Django源代码中注意到了这一点:

请注意,assertRedirects不适用于外部链接,因为它使用 TestClient执行一个请求

那么,如何测试这些重定向呢?我不是在寻找任何超级花哨的东西,我希望检查的是响应的状态代码和位置。我看到响应有一个follow参数,并尝试了类似的方法,但仍然不起作用:

    def test_download(self):
        response = self.client.get('/download/mac/', follow=True)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], settings.URLS.get('mac')
要求我将URL.py和views.py中的相关部分包括在内,如下所示:

# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
    url(r'^download/(?P<platform>\w+)/$', 'download_app', name='download'),
)

#views.py
from django.conf import settings
from django.shortcuts import redirect
from django.http import Http404

def download_app(request, platform):
    if platform in settings.URLS:
        return redirect( settings.URLS.get(platform) )
    else:
        raise Http404
#url.py
从django.conf.url导入模式,url
urlpatterns=patterns('myapp.views',
url(r'^download/(?P\w+)/$,'download\u app',name='download'),
)
#views.py
从django.conf导入设置
从django.shortcuts导入重定向
从django.http导入Http404
def下载应用程序(请求、平台):
如果平台位于settings.url中:
返回重定向(settings.url.get(平台))
其他:
提高Http404

如果您能帮助解决此问题,我们将不胜感激。提前感谢。

可能原始海报已经解决了他的问题,并且在很久以前就开始了,但是这里的解决方案是不要像他在备选方案中那样指定
follow=True
,因为他在备选方案中也没有这样做

下面将简单地检查正在测试的视图是否按预期重定向,而不依赖外部资源

def test_download(self):
    response = self.client.get('/download/mac')

    self.assertEqual(response.status_code, 302)
    self.assertEqual(response['Location'], 'http://external/resource')

在Django 1.7
assertRedirect
中,获得了一个新参数
fetch\u redirect\u response
,该参数可以设置为False以获得相同的效果,但我自己还没有尝试过。

请发布(或链接到)相应的url模式(在url.py中)你的应用程序和views.py中应该返回302(重定向)的方法或函数。好的,但是如果你在这些方法中查找错误,那是非常不可能的,它们非常简单。我不太明白,如果它重定向,那么它重定向-没有必要每次都测试它,是吗?在将客户端转发到某个url之前,您始终可以检查是否在if块中收到200个响应(或每隔一定时间收到一个响应)。@user3467349,这适用于每次生成项目时运行的自动测试套件。如果这些重定向开始失败,那么我的用户将无法下载我的产品,这将是一个巨大的问题。因此,我想在提交新代码和重新构建项目时自动测试转发。此外,转发是通过一些自定义逻辑确定的,因此我不想测试Django的转发能力,我也在测试我的代码确定正确的转发位置。感谢您的帮助,这完全有道理。不知道我怎么会错过,哈!