일부 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 장소.
왜 GET을 사용하여 POST되지 않습니다? –
나는이 함수에 대한 호출을 아약스 호출을 통해 많이하고 싶기 때문에 동일한 페이지에서 포스트를 사용하면 폼을 가지고 페이지를 다시로드해야한다. – Arthur
예를 들어 jQuery를 사용했다면'$. post ('/ some_url /', { 'query': 'select * from something', othervar : 'xyz'}를 사용하는 것이 매우 쉽습니다.)'그리고 모든 것은 (당신이 사용하고있는 어떤 웹 프레임 워크에 의존하여) 요청 객체의 POST [ 'query'] 나 equiv를 취하기 위해서 다른 끝에서 훌륭하고 손상되지 않아야합니다. –