Python Django';s测试客户端返回编码不正确的URL

Python Django';s测试客户端返回编码不正确的URL,python,django,urlencode,django-testing,Python,Django,Urlencode,Django Testing,当用户未登录时试图访问/amos时,我有一个视图应该重定向到/accounts/login/?next=/amos/。为了对此进行测试,我使用以下测试: import urllib # I actually define this function elsewhere, I placed it here for brevity's sake def url_with_querystring(path, **kwargs): return path + '?' + urllib.urle

当用户未登录时试图访问
/amos
时,我有一个视图应该重定向到
/accounts/login/?next=/amos/
。为了对此进行测试,我使用以下测试:

import urllib

# I actually define this function elsewhere, I placed it here for brevity's sake
def url_with_querystring(path, **kwargs):
    return path + '?' + urllib.urlencode(kwargs)

def setUp(self):
    self.client = Client()

def test_call_view_denies_anonymous(self):
    target_url = reverse('amos_index')
    redirect_url = url_with_querystring(reverse('login'), next='/amos/')
    response = self.client.get(target_url, follow=True)
    self.assertRedirects(response, redirect_url)
    response = self.client.post(target_url, follow=True)
    self.assertRedirects(response, redirect_url)
self.assertRedirects(响应,重定向\u url)发生错误。具体而言,它会引发以下错误:

AssertionError: Response redirected to '/accounts/login/?next=/amos/', expected '/accounts/login/?next=%2Famos%2F'
显然,错误来自
/
不等于
%2F
response
返回的重定向URL似乎只是一个原始字符串,而自定义函数返回一个正确编码的URL字符串。在这种情况下我该怎么办?我应该不使用URL编码,还是这是django.test.client的问题

编辑:我在Django项目网站上读到了一篇以前提到的文章。据我所知,这似乎是故意的行为?也就是说,在Django的内部系统中,URL没有编码。希望更多有经验的人能提供一些见解,谢谢

如果你看看Django的方法,它是由像
login\u required
这样的装饰程序使用的,你可以看到它将前斜杠视为一个安全字符,而不编码它们

login_url_parts[4] = querystring.urlencode(safe='/')
你可以在测试中模仿这种行为。但是,我认为最简单的方法是不对字符串进行URL编码。需要测试的重要内容是匿名用户被重定向。在Django中应该已经有测试来确保url编码正确,所以我不确定重复这一点会有什么好处

redirect_url = reverse('login') + '?next=/amos/'
对我来说,这起作用了
self.assertRedirects(response,reverse('login')+”?next='+urllib.parse.quote_plus('/something/'))


别忘了
导入urllib

哦,捕捉得好!谢谢你帮我清理这件事!我想我会用querystring()模拟我的
url\u函数中的行为(以便将来证明它),只是为了重复它,EDIT:
redirect\u to\u login
方法正确地对url编码,除了前斜杠(我用
测试了它)
)。你知道为什么会这样吗,@Alasdair?url编码的不是客户端,而是你在视图中使用的装饰程序调用的
重定向\u到\u登录
方法。哦,好吧!编辑了我的评论。在url的查询部分,
/
没有特定用途,因此它不必编码(从)