2012-11-16 3 views
1

일부 sql과 다른 것들을 가져오고 Json 파일을 반환하는 python 웹 응용 프로그램을 작성하려고합니다. 후자는 문제가 아니며 스크립트에도 넣지 않았습니다. 그러나, 문제는 전달되는 URL을 UTF-8로 인코딩 한 후 URL이 확인 될 것으로 보인다python URL 처리 문제

test=2&query=SELECT+%2B+%3B 

에 우리의 예를

query :SELECT + ; 
test: 2 

를 돌려

인코딩되고 있다는 것이다

01 23,516,

하지만 수신 GET은 다시 문자

에 코드를 확장 할 수 있다고 생각하는 것 같다 그것은

test=2&query=SELECT+++; 

는 다음이 URL을 디코딩 수신이 세미콜론을 자르면, 나는 유지하려면 세미콜론! + 또한 공백으로 올바르게 공백을 넣는 +를 바꿉니다. 그러나 이전 버그는 진짜 플러스 코드를 공간으로 바꾸는 리터럴 플러스로 만들었습니다! 내 테스트 양식에서 생성

#!/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은 다음과 같습니다 :

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 

내가 얻을하고자 다음과 같이

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

출력은 다음과 같이

{'test': '2', 'query': 'SELECT '} 

코드는 내가 전나무에서 인코딩 한 것과 같은 딕트 st 장소.

+0

왜 GET을 사용하여 POST되지 않습니다? –

+0

나는이 함수에 대한 호출을 아약스 호출을 통해 많이하고 싶기 때문에 동일한 페이지에서 포스트를 사용하면 폼을 가지고 페이지를 다시로드해야한다. – Arthur

+0

예를 들어 jQuery를 사용했다면'$. post ('/ some_url /', { 'query': 'select * from something', othervar : 'xyz'}를 사용하는 것이 매우 쉽습니다.)'그리고 모든 것은 (당신이 사용하고있는 어떤 웹 프레임 워크에 의존하여) 요청 객체의 POST [ 'query'] 나 equiv를 취하기 위해서 다른 끝에서 훌륭하고 손상되지 않아야합니다. –

답변

1

데이터를 GET 요청으로 전달하려면 물음표 문자 [?]를 구분 기호로 사용하여 query string 구문을 사용해야합니다.

URL은해야한다 : 그 후

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