我在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请求后,我收到以下错误:
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 :(得分:2)
如果收到此错误消息,则表示您正在尝试更新本地范围之外的变量。
您可以使用非本地语句或重构代码。
抛出此错误的更简单示例是:
x = 1
def update_one():
x += 1
update_one()
您始终可以在父框架中引用变量,但不能使用非本地或全局修改它。
答案 1 :(得分:2)
你在函数内部指定了参数:
(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 :(得分:1)
将params传递给do_GET方法或将其分配给BaseHTTPRequestHandler
的成员字段。