2016-01-03 46 views
1

我已經在python中創建了一個執行一些加密算法的HTTP服務器。所以我嘗試在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() 

一個GET請求,我得到以下錯誤的excution後:

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

@Elazar哎呀,你絕對正確,編輯 – Alec

相關問題