Доступ к возвращенному ключу dict, хотя и разрешен до значения, как и ожидалось, вызывает KeyError? - PullRequest
0 голосов
/ 19 октября 2011

У меня есть функция, которая генерирует и возвращает словарь _GET, содержащий пары ключ / значение запроса поля запроса URI.Предполагая, что URI равен http://127.0.0.1/path/to/query?foo=bar&bar=foo, функция используется следующим образом в производном BaseHTTPServer.BaseHTTPRequestHandler с отмеченным KeyError:

class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "text/plain")
        self.end_headers()

        _GET = query_parse(urlparse.urlparse(self.path).query)

        # No KeyError here..
        print "foo: %s\r\nbar: %s" % (GET["foo"], _GET["bar"])

        # KeyError on _GET["foo"]..
        self.wfile.write("foo: %s\r\nbar: %s\r\n" % (_GET["foo"], _GET["bar"]))

        # Still KeyError on _GET["foo"] even if commenting above line
        # and uncommenting below one!
        #self.wfile.write("bar: %s\r\nfoo: %s\r\n" % (_GET["bar"], _GET["foo"]))

Traceback:

localhost - - [19/Oct/2011 18:21:18] "GET /path/to/query?foo=bar&bar=foo HTTP/1.1" 200 -
localhost - - [19/Oct/2011 18:21:18] "GET /favicon.ico HTTP/1.1" 200 -
Traceback (most recent call last):
  File "E:\Program\Python27\lib\SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "E:\Program\Python27\lib\SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "E:\Program\Python27\lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "E:\Program\Python27\lib\SocketServer.py", line 639, in __init__
    self.handle()
  File "E:\Program\Python27\lib\BaseHTTPServer.py", line 337, in handle
    self.handle_one_request()
  File "E:\Program\Python27\lib\BaseHTTPServer.py", line 325, in handle_one_request
    method()
  File "http-test.py", line 40, in do_GET
    print "foo: %s" % _GET["foo"]
KeyError: 'foo'

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Я не знаю, что делает ваша query_parse функция, но уже есть функция, которая делает то, что urlparse.parse_qs:

>>> query = urlparse.urlparse('http://127.0.0.1/path/to/query?foo=bar&bar=foo').query
>>> urlparse.parse_qs(query)
{'bar': ['foo'], 'foo': ['bar']}

Или, если вам не нравится, чтобы значение словаря было списком, вы можете сделать:

>>> dict(urlparse.parse_qsl(query))
{'bar': 'foo', 'foo': 'bar'}

Надеюсь, это поможет.

0 голосов
/ 19 октября 2011

Вместо query_parse () используйте собственный анализатор запросов Python:

>>> s = 'http://127.0.0.1/path/to/query?foo=bar&bar=foo'
>>> t = urlparse.urlparse(s)
>>> urlparse.parse_qs(t.query)
{'foo': ['bar'], 'bar': ['foo']}

Это было бы легко увидеть с помощью pdb или путем вставки операторов печати для облегчения отладки.

...