2012-08-09 36 views
0

這行代碼:MainHandler中的Python GAE BadArgumentError get(self)方法。如何解決這個問題?

contract = Contract.get_by_id(contract_id) 

從這個塊:

class MainHandler(webapp2.RequestHandler): 
    def get(self):  
     contract_id = self.request.get("contract_id") 
     if contract_id is None: 
      contract = db.GqlQuery("SELECT * FROM Contract ORDER BY date DESC").get() 
      if contract == None: 
       numBook = 1 
       numInitialPage = 1 
       numFinalPage = 1    
     else: 
      contract = Contract.get_by_id(contract_id) 

template_values = {"numBook":numBook, 
          "numInitialPage":numInitialPage, 
          "numFinalPage":numFinalPage} 
     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 

正在產生這樣的錯誤:

 File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "C:\Users\Py\Desktop\contract\main.py", line 277, in get 
     contract_id = self.request.get("contract_id") 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1292, in get_by_id 
    ids, multiple = datastore.NormalizeAndTypeCheck(ids, (int, long)) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 139, in NormalizeAndTypeCheck 
    (types, arg, typename(arg))) 
BadArgumentError: Expected an instance or iterable of (<type 'int'>, <type 'long'>); received (a str). 

我的目標是:如果這個值是通過變量contract_id當傳遞其他處理程序重定向到MainHandler,MainHandler應該使用它。但是如果MainHandler第一次被使用,那麼contract_id的值應該是None而程序應該是另一回事。但是這沒有發生。當MainHandler被調用時,它將'contract_id'(來自self.request.get("contract_id"))解釋爲一個字符串值。如何解決這個問題並實現我的目標?

回答

2

錯誤告訴你什麼是它預計intint列表。這與docs一致。所以您需要先將contract_id轉換爲int

... 
else: 
    contract = Contract.get_by_id(int(contract_id)) 

此外,您需要更改如何檢查contract_id是否通過。當值未定義時,self.request.get方法返回空字符串。請參閱。

所以,你必須在這裏選擇:

contract_id = self.request.get("contract_id") 
if not contract_id: 

contract_id = self.request.get("contract_id", None) 
if contract_id is None: 
+0

非常感謝您,塞巴斯蒂安,但是,開放時使用的第一次,'contract_id'沒有價值。如果我使用'contract = Contract.get_by_id(int(contract_id))'我得到這個錯誤:'ValueError:int()以10爲底的無效文字:'''。 – craftApprentice 2012-08-09 17:23:01

+0

@ Pythonista'sApprentice:umm ..然後在打電話之前檢查它是否有價值? – geoffspear 2012-08-09 17:25:13

+0

查看更新的代碼。你之前做的檢查是錯誤的。 – 2012-08-09 17:28:44