1

私はいくつかのSQLと他のものを取り、Jsonファイルを返すPythonウェブアプリを書こうとしています、後者の部分は問題ではなく、まだスクリプトに入れていません、問題は渡されるURLはutf-8エンコードされ、次に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()

テストフォームから生成されたURLは次のとおりです。

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

そもそも私がエンコードするgetから同じdictを取得したいと思います。

4

1 に答える 1

1

If you want to pass data into a GET request, you need to use the query string syntax using the question mark character [?] as a delimiter.

The URL should be:

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

After that, you just have to use web.input() to get a dictionary with all arguments already decoded.

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']

Result:

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
于 2012-11-16T14:06:27.800 に答える