编辑:当我说"全局变量"在帖子中,我指的是mtcbody脚本; django代码没有使用全局变量。
我有一个相当神秘的问题;我有一个python脚本,它接受一个XML文件,解析它并返回一些结果。此脚本具有一些用于完成其工作的全局变量。当我在本地运行这个脚本时,例如,从eclipse开始,这些全局变量和其他所有变量在最后被自动销毁,新的运行使用新资源(如预期的那样)。
但是,当我从Django视图运行此脚本时,我期望相同的行为,但相反,此脚本会持久保存全局变量,并在每次发出请求时添加它们。
这是从eclipse本地运行它的一个例子:
import mtcbody
def doShit():
context = {}
result = mtcbody.getData()
# the variable result['tvas_after'] is one of the global variables in the mtcbody script
print 'TVAs after: ' + str(result['tvas_after'])
return context
if __name__ == '__main__':
doShit()
首次运行后的结果:
TVAs after: {'1': <mtcbody.TVA instance at 0x7f28011aac20>}
第二次运行后的结果:
TVAs after: {'1': <mtcbody.TVA instance at 0x7f94bbb96c20>}
第三次运行后的结果:
TVAs after: {'1': <mtcbody.TVA instance at 0x7f9509f49c20>}
正如您所看到的,在每次运行期间,从头开始重新填充保存TVA实例的字典;现在将它与我从django视图运行相同脚本时获得的行为进行比较:
def index(request):
context = RequestContext(request)
result = mtcbody.getData()
print 'TVAs after: ' + str(result['tvas_after'])
return render(request, 'dashboardbase/table.html', context)
首次刷新(请求)后的结果
TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>}
第二次刷新(请求)后的结果
TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>, '2': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff066e4afc8>}
第三次刷新(请求)后的结果
TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>, '3': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0a1fa4ea8>, '2': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff066e4afc8>}
如您所见,在调用Django视图之间保留了脚本中的变量。有人可以解释这种行为,如果可能的话,如何避免这种行为并使其表现得像在本地运行一样。
谢谢
答案 0 :(得分:2)
我不知道为什么你觉得这个行为难以解释。脚本运行一次然后退出,但服务器应用程序是持久的,因此全局数据在该应用程序中是持久的并不奇怪。
解决方案应该是显而易见的:不要使用全局变量。它们很少有用,除非奇怪的情况是做实际上希望数据在调用之间保持不变。特别是在服务器环境中,不同用户可以在不同时间请求资源,全局变量是危险的。在你的情况下,如果没有看到mtcbody
中的相关函数,很难建议,但似乎你应该传递该模块中的数据,可能是通过一个类。