全局变量更改未反映在服务器调用中

时间:2016-01-07 09:57:00

标签: python urllib2

我正在尝试呼叫服务器来检查它的状态。服务器代码具有全局变量" status"设置为True或False。服务器发送' UP'或者' DOWN'基于状态值。

我将服务器文件导入到我的主文件中并尝试将变量设置为False。然后我发送了一个新的请求,期待一个“下降”。状态。

myfile.py

import server

response = urllib2.urlopen(url).read()  #1
server.print_status() #2 Prints True (the default value) as expected
server.status = False #3
server.print_status() #4 Prints False as expected
response = urllib2.urlopen(url).read()  #5
server.print_status() #6 Prints False as expected

server.py

status = True

def print_status()
    global status
    print status

class Handler(object):
    @staticmethod
    def handle(start_response):
        global status
        print status
        if status:
            start_response('200 OK')
            return ['UP']
        else:
            start_response('503 Service Unavailable')
            return ['DOWN']

现在我期待一个'DOWN'第5行的回复,但它总是返回' UP'。我也在服务器的请求处理程序中打印状态值。即使第4行和第6行打印为False,状态也会打印为True(第5行)而不是False。

服务器代码没有问题,我确定。这可能是因为我调用服务器或使用urllib2的方式。关于我做错了什么的任何建议。

2 个答案:

答案 0 :(得分:0)

这里没有足够的信息来正确理解出了什么问题。但是服务器本身几乎肯定是在一个完全独立的进程中运行,以允许它响应请求。该进程中的内部变量不会以任何方式与您在shell中导入代码所获得的内部变量共享;他们不可能。

要使其工作,您需要实际将值传递给服务器进程。最简单的方法可能是将其写入文件,并让服务器定期读取该文件。或者你可以用套接字实现类似的东西。

答案 1 :(得分:0)

正如我在评论和Daniel的回答中所描述的那样,客户端和服务器是两个不同的进程,它们不共享status变量,即使在同一个python模块中定义了两个都是导入。

我建议客户端通过HTTP调用指定状态,将其POST到服务器

query_args = { 'status': 'DOWN' }
encoded_args = urllib.urlencode(query_args)
response = urllib2.urlopen(url, encoded_args).read()

然后服务器可以检查POST数据并相应地更新其状态(假设整个交互有任何意义)