2013-07-09 24 views
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 

想法是調用方法添加應該添加到類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方法的三個連續呼叫日誌中可以看出,但是十五時12分46秒的應用程序重新創建類點心對象和總和reseted 0問題是:是由應用程序或wsgi重新加載類?如何防止應用程序(或服務器)重新加載類?有沒有什麼辦法可以記住兩個方法調用與ladon框架之間的var狀態?我想避免使用數據庫。

回答

1

您的Sum對象不是持久的,並且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 
+0

我希望我將學會如何控制服務器實例類和對象:你可以使用pikle,像文件系統再接再厲,總和值。這是可以接受的解決方案,但並不完美。在我的類定義中,我可以有連接到mysql數據庫並執行查詢的代碼段,如果我的應用程序每次接收到請求時都連接到數據庫,它可能會影響性能。但現在,這已經足夠了。 – user1267132

0

您可以將總和值保存在文件中,但每個請求都會增加相同的基準值。 另一種方法是使用像燒杯這樣的Session。每個請求者發送一個session_id和要添加的號碼。你的web服務返回session_id和相應的總和。

祝您有愉快的一天。 Gabriel