Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python URL处理问题_Python_String_Url_Web Applications - Fatal编程技术网

python 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解码,它去掉了分号,我想保留分号! 它还将+(正确地说是空格)转换为空格,但之前

我正在尝试编写一个python web应用程序,它将接受一些sql和其他一些东西并返回一个Json文件,后一部分不是问题所在,我甚至还没有将其放入脚本中,问题是传递的url是utf-8编码,然后是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服务器(例如扭曲,但有很多)。谢谢,我知道这是需要的,但不知为何忽略了丢失的内容。谢谢,我知道这是必要的,但不知怎么的忽略了缺失的?:)