在Django中测试请求参数("+"表现不同)

eil*_*rra 7 python django

我有一个Django View,它使用查询参数进行一些内容过滤.像这样的东西:

/page/?filter=one+and+two
/page/?filter=one,or,two
Run Code Online (Sandbox Code Playgroud)

我注意到Django将其转换+为空格(request.GET.get('filter')返回one and two),我就可以了.我只需要相应地调整split()我在View中使用的功能.

但...

当我尝试测试此视图时,我打电话给:

from django.test import Client
client = Client()
client.get('/page/', {'filter': 'one+and+two'})
Run Code Online (Sandbox Code Playgroud)

request.GET.get('filter')返回one+and+two:加号,没有空格.为什么是这样?

我想认为这Client().get()模仿了浏览器的行为,所以我想了解的是为什么调用client.get('/page/', {'filter': 'one+and+two'})不像浏览/page/?filter=one+and+two.出于测试目的,它在我看来应该是相同的,并且在两种情况下,视图应该为过滤器接收一致的值:be with with +或with space.

我没有得到的是为什么有两种不同的行为.

Mar*_*ers 12

查询字符串中的加号是空格的正常和正确编码.这是一件历史文物; URL的表单值编码与编码URL中的其他元素略有不同.

Django负责将查询字符串解码回键值对; 该解码包括解码URL百分比编码,其中a +被解码为空间.

使用测试客户端时,您传入未编码的数据,因此您将使用:

client.get('/page/', {'filter': 'one and two'})
Run Code Online (Sandbox Code Playgroud)

然后将其编码为查询字符串,并在尝试访问参数时再次进行解码.