1

我正在尝试编写一个 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。

4

1 回答 1

1

如果要将数据传递到 GET 请求中,则需要使用查询字符串语法,使用问号字符 [?] 作为分隔符。

网址应为:

http://localhost:8080/data/?test=2&query=SELECT+%2B+%3B

之后,您只需要使用 web.input() 来获取所有参数都已解码的字典。

urls = (
    '/query', 'query',
    '/data/', 'data'
)

[...] 

class data:
    def GET(self):
        data = web.input()
        print "dict:", data
        print "element:", data['query']

        if ( re.match('SELECT [^;]+ ;', data['query'])):
            return 'good::'+data['query']
        else:
            return 'Bad::'+data['query']

结果:

dict: <Storage {'test': u'2', 'query': u'SELECT + ;'}>
element: SELECT + ;
127.0.0.1:44761 - - [16/Nov/2012 15:06:06] "HTTP/1.1 GET /data/" - 200 OK
于 2012-11-16T14:06:27.800 回答