首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django的测试客户端返回一个编码不当的URL

Django的测试客户端返回一个编码不当的URL
EN

Stack Overflow用户
提问于 2016-03-23 14:54:12
回答 2查看 675关注 0票数 2

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

代码语言:javascript
复制
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(response, redirect_url)中。具体来说,它会引发此错误:

代码语言:javascript
复制
AssertionError: Response redirected to '/accounts/login/?next=/amos/', expected '/accounts/login/?next=%2Famos%2F'

显然,错误来自于/不等于%2Fresponse返回的重定向URL似乎只是一个原始字符串,而自定义函数返回一个正确的URL编码字符串。在这种情况下我该怎么办?我应该不使用URL-编码,还是这是django.test.client的问题?

编辑:我在DjangoProject网站上读到了一个以前提到过的DjangoProject。据我所知,这似乎是有意的行为?也就是说,在Django的内部系统中,URL没有编码。想从更有经验的人那里得到一些见解,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 15:11:57

如果查看Django的redirect_to_login方法(由login_required之类的装饰器使用),可以看到它将正斜杠视为一个安全字符,而不对它们进行编码。

代码语言:javascript
复制
login_url_parts[4] = querystring.urlencode(safe='/')

你可以在你的测试中模仿这种行为。但是,我认为简单地不对字符串进行urlencode是最简单的。重要的是要测试匿名用户是否被重定向。Django中应该已经进行了测试,以确保url是正确编码的,所以我不确定通过重复这样做可以获得多少好处。

代码语言:javascript
复制
redirect_url = reverse('login') + '?next=/amos/'
票数 2
EN

Stack Overflow用户

发布于 2018-08-21 09:19:25

对我来说这起作用了

self.assertRedirects(response, reverse('login') + '?next=' + urllib.parse.quote_plus('/something/'))

别忘了import urllib

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36181531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档