我正在尝试编写一个 python web 应用程序,它需要一些 sql 和一堆其他东西并返回一个 Json 文件,后半部分不是问题,我什至还没有把它放在脚本中,问题是正在传递的 url 是 utf-8 编码,然后是 url 编码
转动我们的榜样
query :SELECT + ;
test: 2
进入
test=2&query=SELECT+%2B+%3B
这似乎没问题
但接收 get 似乎认为它可以将代码扩展回字符
它收到
test=2&query=SELECT+++;
然后这是 url 解码,它砍掉了分号,我想保留分号!它还将正确的空格 + 转换为空格,但之前的错误使真正的加号代码变为文字加号,从而将其转换为空格!
{'test': '2', 'query': 'SELECT '}
代码如下:
#!/usr/bin/python
import web
import psycopg2
import re
import urllib
import urlparse
urls = (
'/query', 'query',
'/data/(.*)', 'data'
)
app = web.application(urls, globals())
render = web.template.render('templates/')
class query:
def GET(self):
return render.query()
def POST(self):
i = web.input()
data = {}
data['query'] = i.sql.encode('utf-8')
data['test'] = '2'
murl = urllib.urlencode(data)
return "<a href=\"http://localhost:8080/data/"+murl+"\">go!</a>"
class data:
def GET(self, urlEncodedDict):
print "raw type:", type(urlEncodedDict)
print "raw:", urlEncodedDict
urlEncodedDict = urlEncodedDict.encode('ascii', 'ignore')
print "ascii type:", type(urlEncodedDict)
print "ascii:", urlEncodedDict
data = dict(urlparse.parse_qsl(urlEncodedDict, 1)) #bad bit
print "dict:", data
print "element:", data['query']
if ( re.match('SELECT [^;]+ ;', data['query'])):
return 'good::'+data['query']
else:
return 'Bad::'+data['query']
if __name__ == "__main__":
app.run()
从我的测试表单生成的 URL 是:
http://localhost:8080/data/test=2&query=SELECT+%2B+%3B
输出如下:
raw type: <type 'unicode'>
raw: test=2&query=SELECT+++;
ascii type: <type 'str'>
ascii: test=2&query=SELECT+++;
dict: {'test': '2', 'query': 'SELECT '}
element: SELECT
127.0.0.1:53272 - - [16/Nov/2012 11:05:44] "HTTP/1.1 GET /data/test=2&query=SELECT+++;" - 200 OK
127.0.0.1:53272 - - [16/Nov/2012 11:05:44] "HTTP/1.1 GET /favicon.ico" - 404 Not Found
我希望从我首先编码的get中得到相同的dict。