2016-01-03 3 views
1

Я создал HTTP-сервер в python, который выполняет некоторые криптографические алгоритмы. Поэтому я пытаюсь создать важные переменные для моей криптографии вне метода GET, так как я не хочу, чтобы они менялись после каждого запроса.
Ошибка: Локальная переменная, привязанная до назначения

Вот пример кода:

class Handler(BaseHTTPRequestHandler): 


    def do_GET(self):  
     path = self.path 
     print 'request for ' + path 
     rootdir = '/Server' 

     client_mac = path.split('?')[-1]    
     file_name = path.split('?')[0] 

     if self.path.split('?')[0].endswith('.txt'): 

      '''create client ID''' 
      print 'Printing mac address of connected device ----> %s' % client_mac 

      id1_secret_key = pre.keyGen(master_secret_key, client_mac) 

      fr = open (rootdir + file_name) 
      file_data = fr.read() 
      sym_key_ciphertext = pre.encrypt(params, client_mac, sym_key); 
#more code follows 

try: 

    httpd = HTTPServer(('',8080), Handler) 
    print 'Server is on and listening to port...7000' 

    group = PairingGroup('SS512', secparam=1024) 
    pre = PreGA(group) 
    (master_secret_key, params) = pre.setup() 
    print params 
    sym_key = OpenSSLRand().getRandomBytes(128) #128 bits 
    sym_cipher = AuthenticatedCryptoAbstraction(sym_key) 
    server_mac = get_mac() 
    id2_secret_key = pre.keyGen(master_secret_key, str(server_mac)) 

    httpd.serve_forever() 
except KeyboardInterrupt: 
    print '^C received,shutting down the web server' 
    server.socket.close() 

После excution запроса GET я получаю следующее сообщение об ошибке:

File "server.py", line 157, in do_GET 
ciphertext = pre.encrypt(params, client_mac, file_data); 
UnboundLocalError: local variable 'params' referenced before assignment 

Я должен упомянуть, что переменной Params имеет значение после того, как выполнение pre.setup(). Любые советы были бы полезны и глубоко оценены.

+0

Ваш код не ясен. является частью 'try' внутри или вне функции? внутри или вне класса? пожалуйста, исправьте отступ соответственно – Elazar

+1

Соответствует: http://stackoverflow.com/questions/370357/python-variable-scope-error – Elazar

+0

Тест находится за пределами класса – PL13

ответ

2

Вы назначаете в Params внутри функции:

(master_secret_key, params) = pre.setup() 

так это локальная переменная. Вы получаете доступ к нему до назначения. Неясно из вашего кода, где это происходит, но следующая строка может сделать это, если он находится внутри функции:

sym_key_ciphertext = pre.encrypt(params, client_mac, sym_key) 

так что вы получите ошибку. Ваш код не ясно, но если это глобальная переменная, вы должны объявить его как таковой:

global params 
... 
(master_secret_key, params) = pre.setup() 

лучше: не использовать глобальную переменную, и назначить другой один

2

Если вы получили это сообщение об ошибке, вы пытаетесь обновить переменную, находящуюся за пределами локальной области.

Вы можете использовать нелокальный оператор или реорганизовать свой код.

Более простой пример того, что бы бросить эту ошибку является:

x = 1 
def update_one(): 
    x += 1 
update_one() 

Вы всегда можете ссылаться на переменную в родительском фрейме, но вы не можете изменить его без использования нелокальной или глобальной.

+0

Это не имеет значения. Вы не обновляете переменную. Вы мутируете объект, который вообще не меняет указатель. –

+0

Я бы не рассматривал возможность изменения объекта, изменяющего переменную. Я бы подумал, что это мутирует или модифицирует объект. Полагаю, я мог бы быть более ясным. –

1

Либо пройти Params в метод do_GET или присвоить его полю элемента BaseHTTPRequestHandler.

+1

@ Элазар кричит, ты абсолютно прав, отредактирован – Alec

Смежные вопросы