2011-09-06 50 views
2

我正在做我的第一個Python項目(GAE),並且使用查詢操作GAE的數據庫沒有困難。但是當編輯單個實體時,我面臨一個問題。 我需要的只是一個簡單的計數器,它會在每次訪問時增加。 所以我創建一個實體(這樣做一次,只是爲了創造實體,那麼這段代碼是從項目中刪除)由:如何在GAE(Python)中編輯單個實體?

counter_name = 'default_counter' 

def counter_key(counter_n=None): 
    return db.Key.from_path('Counter', counter_name) 

class Counter(db.Model): 
    amount = db.IntegerProperty() 

class CounterClass(webapp.RequestHandler): 
    def get(self): 
     counter = Counter(counter_key(counter_name)) 
     counter.amount = 0 
     counter.put() 

這是確定。 但是,當我試圖增加它,使用:

counter = db.get(db.Key.from_path('Counter', 'default_counter')) 
counter.amount += 1 
counter.put() 

我得到這個錯誤。

ERROR 2011-09-06 21:49:41,562 _webapp25.py:464] 'NoneType' object has no attribute 'amount' Traceback (most recent call last): File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp_webapp25.py", line 703, in call handler.post(*groups) File "H:\gae-bin\counter.py", line 48, in post counter.amount += 1 AttributeError: 'NoneType' object has no attribute 'amount'

我檢查了不同的變化,但仍然不能改變實體的價值。 我在做什麼錯?

在此先感謝。

回答

2

這樣的技術您用於創建Counter實體的代碼可能是錯誤的。它所做的是創建一個Counter實體,其實體Counter與鍵名等於default_counter。這似乎並不是你想要的,正如你用來更新計數器的代碼所證明的那樣。

您需要通過以下方式之一來分配你Counter實體鍵名:

counter = Counter(key_name='default_counter') 
# or 
counter = Counter(key=db.Key.from_path('Counter', 'default_counter')) 

注意,一般來說它是壞主意,有一個這樣的訪問計數器。 GAE實體每秒鐘有5次更新,所以如果你超出這個範圍,你將遇到問題。

處理更新限制的常用技巧是使用分片計數器,如此處所述:http://code.google.com/intl/pl/appengine/articles/sharding_counters.html。如果您不介意偶爾會丟失一些計數器增量,則數據存儲和內存緩存的組合也是一種選擇。

1

你實際上並沒有用那個鍵創建實體。如果你想改變:

counter = Counter(db.Key.from_path('Counter', 'default_counter')) 

這樣:

counter = Counter(key=db.Key.from_path('Counter', 'default_counter')) 

而且因爲你的金額立即設置爲0,你可以初始化實體時也這樣做:

counter = Counter(key=db.Key.from_path('Counter', 'default_counter'), amount=0) 

另請注意,這不是一個在App Engine上創建計數器的好方法。您需要使用像sharded counterssomething using memcached

+0

謝謝。 但是實體是無論如何創建的。我可以在數據庫索引中的localhost/_ah/admin中看到。 感謝您的鏈接。我會嘗試這些。 – momijigari

+1

或者你也可以這樣做'Counter(key_name ='default_counter',amount = 0)' - 不需要指定整個鍵。 –

相關問題