私はいくつかのSQLと他のものを取り、Jsonファイルを返すPythonウェブアプリを書こうとしています、後者の部分は問題ではなく、まだスクリプトに入れていません、問題は渡される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を取得したいと思います。