python URL处理问题
我正在尝试编写一个python web应用程序,它将接受一些sql和其他一些东西并返回一个Json文件,后一部分不是问题所在,我甚至还没有将其放入脚本中,问题是传递的url是utf-8编码,然后是url编码 以我们为例python URL处理问题,python,string,url,web-applications,Python,String,Url,Web Applications,我正在尝试编写一个python web应用程序,它将接受一些sql和其他一些东西并返回一个Json文件,后一部分不是问题所在,我甚至还没有将其放入脚本中,问题是传递的url是utf-8编码,然后是url编码 以我们为例 query :SELECT + ; test: 2 进入 这似乎没问题 但是接收get似乎认为它可以将代码扩展回字符 它收到 test=2&query=SELECT+++; 然后这是url解码,它去掉了分号,我想保留分号! 它还将+(正确地说是空格)转换为空格,但之前
query :SELECT + ;
test: 2
进入
这似乎没问题
但是接收get似乎认为它可以将代码扩展回字符
它收到
test=2&query=SELECT+++;
然后这是url解码,它去掉了分号,我想保留分号!
它还将+(正确地说是空格)转换为空格,但之前的错误将real plus代码转换为literal plus,从而将其转换为空格
{'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()
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
结果如下:
#!/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()
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
原始类型:
原始:test=2&query=SELECT++;
ascii类型:
ascii:test=2&query=SELECT++;
格言:{'test':'2','query':'SELECT'}
元素:选择
127.0.0.1:53272---[16/Nov/2012 11:05:44]“HTTP/1.1get/data/test=2&query=SELECT++;”-200确定
127.0.0.1:53272---[16/Nov/2012 11:05:44]“HTTP/1.1get/favicon.ico”-找不到404
我希望从get中获取与我首先编码的相同的dict。如果要将数据传递到get请求,需要使用问号字符[?]作为分隔符的语法 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
dict:
元素:选择+;
127.0.0.1:44761---[16/Nov/2012 15:06:06]“HTTP/1.1get/data/”-200正常
如果要将数据传递到GET请求中,需要使用问号字符[?]作为分隔符的语法
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
dict:
元素:选择+;
127.0.0.1:44761---[16/Nov/2012 15:06:06]“HTTP/1.1get/data/”-200正常
为什么要使用GET而不是POST?因为我想通过ajax调用从同一个页面对此函数进行多次调用,如果我使用POST,我必须有一个表单并重新加载页面。不太可能,例如,如果使用jQuery,则很容易执行$.POST('/some_url/',{'query':'select*from'something',othervar:'xyz})
而另一端(取决于您使用的web框架)的所有内容都应该完好无损,只接收请求对象的POST['query']或等效内容。问题似乎在于“web”模块,它将urlencodedct
一个错误的预解码字符串传递给您。如果我可以推荐任何东西,而不是考虑使用其他方法来制作Web服务器(例如,扭曲,但有很多)。为什么要使用GET而不是POST?因为我想通过Ajax调用对这个函数进行多次调用,如果我使用POST,我就必须有一个表单并重新加载页面。例如,如果您使用jQuery,那么做$.post('/some_url/',{'query':'select*from',othervar:'xyz'})将非常容易。
并且在另一端(取决于您使用的web框架)一切都应该是好的和完整的,以便只接收请求对象的post['query']问题似乎出在“web”模块上,它在urlencodedct
中向您传递一个错误的预解码字符串。如果我可以推荐任何东西,那就是考虑使用其他方法来制作Web服务器(例如扭曲,但有很多)。谢谢,我知道这是需要的,但不知为何忽略了丢失的内容。谢谢,我知道这是必要的,但不知怎么的忽略了缺失的?:)