我正在使用python ladon包和SOAP公开Web服务。我想记住两个方法调用之间的状态。以下是示例代码:
from ladon.ladonizer import ladonize
import logging
class Sum(object):
sum = 0
FORMAT = '%(name)s %(asctime)s %(levelname)s %(message)s'
logging.basicConfig(filename='/path/to/my/dir/Sum.log', level=logging.DEBUG, format=FORMAT)
logger = logging.getLogger('Sum')
logger.debug("Starting")
@ladonize(int,rtype=int)
def Add(self, num):
Sum.logger.debug("Adding " + str(num))
Sum.sum += num
Sum.logger.debug("sum is now " + str(Sum.sum))
return Sum.sum
想法是调用方法Add with integer参数,该参数应该添加到类sum变量中。由于sum是类变量(与实例变量相反),只要服务器或应用程序不重新加载代码,就应该保留状态。以下是日志结果:
Sum 2013-07-09 15:12:34,303 DEBUG Starting
Sum 2013-07-09 15:12:34,311 DEBUG Adding 5
Sum 2013-07-09 15:12:34,311 DEBUG sum is now 5
Sum 2013-07-09 15:12:36,169 DEBUG Adding 5
Sum 2013-07-09 15:12:36,169 DEBUG sum is now 10
Sum 2013-07-09 15:12:39,404 DEBUG Adding 5
Sum 2013-07-09 15:12:39,405 DEBUG sum is now 15
Sum 2013-07-09 15:12:46,734 DEBUG Starting
Sum 2013-07-09 15:12:46,742 DEBUG Adding 5
Sum 2013-07-09 15:12:46,743 DEBUG sum is now 5
正如在日志中可以看到的,它可以连续三次调用Add方法,但在15:12:46应用程序重新创建类Sum对象,sum重置为0.问题是:是应用程序还是wsgi重新加载的类?如何防止应用程序(或服务器)重新加载类?有没有办法在使用ladon框架的两个方法调用之间记住var的状态?我想避免使用数据库。
答案 0 :(得分:1)
您的Sum对象不是持久的,sum变量(以及所有其他变量)将重置为其初始值。您可以使用pikle使文件系统中的sum值保持持久性,例如:
import pickle
@ladonize(int,rtype=int)
def Add(self, num):
Sum.logger.debug("Adding " + str(num))
try:
Sum.sum = pickle.load( open( "sum.p", "rb" ) )
except:
pass
Sum.sum += num
Sum.logger.debug("sum is now " + str(Sum.sum))
pickle.dump( Sum.sum, open( "sum.p", "wb" ) )
return Sum.sum
答案 1 :(得分:0)
您可以将sum值保存在文件中,但随后每个请求都会递增相同的基值。 另一种方式是使用像烧杯这样的会话。每个请求者都发送一个session_id和要添加的号码。您的webservice返回session_id和相应的总和。
祝你有个愉快的一天。 加布里埃尔