我有一个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)
然后将其编码为查询字符串,并在尝试访问参数时再次进行解码.