Python Django,测试重定向到外部页面
我在Django应用程序中有一个路由规则,用于重定向到外部CDN的下载。我现在正在为我的应用程序编写测试,我想测试路由是否成功重定向到Django设置中配置的url。下面是一个简化的示例,可以帮助解释我要做的事情: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
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的转发能力,我也在测试我的代码确定正确的转发位置。感谢您的帮助,这完全有道理。不知道我怎么会错过,哈!