1

我正在使用 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 应该添加到类 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 状态?我想避免使用数据库。

4

2 回答 2

1

您的 Sum 对象不是持久的,并且 sum 变量(以及所有其他变量)重置为其初始值。您可以使用pikle使文件系统中的总和值持久化,例如:

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
于 2013-07-09T14:31:24.113 回答
0

您可以将总和值保存在文件中,但随后每个请求都会增加相同的基值。另一种方法是使用像烧杯这样的会话。每个请求者都会发送一个 session_id 和要添加的数字。您的网络服务返回 session_id 和相应的总和。

祝你今天过得愉快。加布里埃尔

于 2013-07-09T14:30:33.100 回答