我想寫一個python web應用程序,它將採取一些sql和一堆其他的東西,並返回一個Json文件,後者不是問題,我甚至沒有把它放在腳本中然而,問題是,正在傳遞的網址是被UTF-8編碼,然後URL編碼python 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()
鏈接:
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
我希望得到同樣的詞典出於我在杉木編碼st地方。
你爲什麼要使用GET和POST不是? –
因爲我想通過ajax調用來調用這個函數,在同一頁面上,如果我使用後我將不得不有一個窗體並重新加載頁面。 – Arthur
不是真的,如果你正在使用jQuery,例如'$ .post('/ some_url /',{'query':'select * from something',othervar:'xyz'}會很容易。 )',並且在另一端(取決於你使用的是什麼Web框架),一切都應該很好,並且完整無缺,只需要接受請求對象的POST ['query']或equiv。 –