SSL выполняется перед анализом заголовка, это означает:
Client creates Request
Request gets encrypted
Encrypted request gets transmitted to the Server
Server decrypts the Request
Request gets parsed
Запрос выглядит примерно так (не помню точный синтаксис, но это должно быть достаточно близко):
GET /search?q=qwerty HTTP/1.1
Host: www.google.de
Именно поэтому наличие разных SSL-сертификатов для нескольких хостов на одном и том же IP-адресе является проблематичным, запрошенное имя хоста неизвестно до дешифрования.
Вы встречаетесь с тем, что часто упоминается (возможно, не совсем педантично ;-) как «проблема области видимости» в Python - привязка запаздывает (лексический поиск во время вызова ) в то время как вы хотели бы это пораньше (по умолчанию). Итак, где у вас теперь есть:
for item in menuitems:
entry = menu.addAction(item)
self.connect(entry,QtCore.SIGNAL('triggered()'), lambda: self.doStuff(item))
попробуйте вместо этого:
for item in menuitems:
entry = menu.addAction(item)
self.connect(entry,QtCore.SIGNAL('triggered()'), lambda item=item: self.doStuff(item))
Это "предвосхищает" привязку, поскольку значения по умолчанию (как здесь item
) вычисляются один раз и навсегда в определенный момент времени. Добавление одного уровня вложенности функций (например, двойной лямбды) тоже работает, но здесь это немного излишне! -)
В качестве альтернативы вы можете использовать functools.partial (self.doStuff, item)
( с import functools
вверху, конечно), что является еще одним прекрасным решением, но я бы выбрал самый простой (и самый распространенный) "
Это должно сработать, но я почти уверен, что есть способ получше, который я сейчас не припомню.
def do_stuff_caller(self, item):
return lambda: self.doStuff(item)
...
self.connect(entry, QtCore.SIGNAL('triggered()'), self.do_stuff_caller(item))
Правка : Более короткая версия, я все еще не об этом думаю ... или, может быть, она была на другом языке? :)
(lambda x: lambda self.do_stuff(x))(item)