Skip to main content
 首页 » 编程设计

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

2024年10月25日43kevingrace

我的 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')) 

现在这行不通了,即使当我打印 settings.DOWNLOAD_URL 时,重定向也会收到 404,它是正确的,并且复制/粘贴到浏览器中证明它有效。我开始研究为什么它不起作用,我在 Django 源代码中注意到了这一点:

Note that assertRedirects won't work for external links since it uses TestClient to do a request.

那么,如何测试这些重定向呢?我不是在寻找任何 super 花哨的东西,我希望检查的是响应的 status_code 和位置。我看到 response 有一个 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') 

有人要求我包含我的 urls.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 

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

请您参考如下方法:

可能发帖人早就解决了他的问题并继续前进,但这里的解决方案是不指定follow=True,就像他在替代提案中所做的那样也没用。

下面将简单地检查被测试的 View 是否按预期重定向,而不依赖于外部资源。

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_redirect_response 可以将其设置为 False 以获得相同的效果,但我自己还没有尝试过。