2012-11-16 34 views
1

我想寫一個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地方。

+0

你爲什麼要使用GET和POST不是? –

+0

因爲我想通過ajax調用來調用這個函數,在同一頁面上,如果我使用後我將不得不有一個窗體並重新加載頁面。 – Arthur

+0

不是真的,如果你正在使用jQuery,例如'$ .post('/ some_url /',{'query':'select * from something',othervar:'xyz'}會很容易。 )',並且在另一端(取決於你使用的是什麼Web框架),一切都應該很好,並且完整無缺,只需要接受請求對象的POST ['query']或equiv。 –

回答

1

如果要將數據傳遞給GET請求,則需要使用query string語法,並使用問號字符[?]作爲分隔符。

網址應爲:

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 
+0

謝謝,我知道這是必要的,但不知何故忽略了失蹤? :) – Arthur