在本地运行python脚本与Django之后进行清理

时间:2014-09-10 15:09:19

标签: python django garbage-collection persistence

编辑:当我说"全局变量"在帖子中,我指的是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视图之间保留了脚本中的变量。有人可以解释这种行为,如果可能的话,如何避免这种行为并使其表现得像在本地运行一样。

谢谢

1 个答案:

答案 0 :(得分:2)

我不知道为什么你觉得这个行为难以解释。脚本运行一次然后退出,但服务器应用程序是持久的,因此全局数据在该应用程序中是持久的并不奇怪。

解决方案应该是显而易见的:不要使用全局变量。它们很少有用,除非奇怪的情况是实际上希望数据在调用之间保持不变。特别是在服务器环境中,不同用户可以在不同时间请求资源,全局变量是危险的。在你的情况下,如果没有看到mtcbody中的相关函数,很难建议,但似乎你应该传递该模块中的数据,可能是通过一个类。