[英]Django: Cleaning up redis connection after client disconnects from stream
[英]Cleaning up after a python script has been run locally vs from Django
编辑:当我在帖子中说“全局变量”时,我指的是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视图调用之间被保留。 有人可以解释这种现象,如果可能的话,如何避免它,并使它看起来像在本地运行一样。
谢谢
我不知道为什么您很难解释这种行为。 脚本运行一次然后退出,但是服务器应用程序是持久的,因此全局数据在该应用程序中是持久的也就不足为奇了。
解决方案应该显而易见:不要使用全局变量。 他们很少有帮助,但在奇数的情况下,当你真正想要的数据调用之间持续存在。 特别是在服务器环境中,不同的用户可能在不同的时间请求资源,全局变量很危险。 在您的情况下,很难看到mtcbody
的相关功能,因此很难建议,但是似乎您应该通过类传递该模块中的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.