2009-11-12 2 views
0

응용 프로그램을 Google 응용 프로그램 엔진에 업로드하고 브라우저에서 호출 한 후이 오류 페이지가 나타납니다.webapp.RequestHandler 클래스에서 함수 인수를 보낼 수 없습니다.

Traceback (most recent call last): 
    File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__ 
    handler.get(*groups) 
    File "/base/data/home/apps/bulkloader160by2/1-5.337695659246114067/new_main.py", line 59, in get 
    transfer = _transfer_funds(src_key,dest_key,amt) 
    File "/base/data/home/apps/bulkloader160by2/1-5.337695659246114067/new_main.py", line 24, in _transfer_funds 
    return db.run_in_transaction(_tx) 
    File "/base/python_lib/versions/1/google/appengine/api/datastore.py", line 1885, in RunInTransaction 
    DEFAULT_TRANSACTION_RETRIES, function, *args, **kwargs) 
    File "/base/python_lib/versions/1/google/appengine/api/datastore.py", line 1982, in RunInTransactionCustomRetries 
    result = function(*args, **kwargs) 
    File "/base/data/home/apps/bulkloader160by2/1-5.337695659246114067/new_main.py", line 11, in _tx 
    account = db.get(src_key) 
    File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1178, in get 
    keys, multiple = datastore.NormalizeAndTypeCheckKeys(keys) 
    File "/base/python_lib/versions/1/google/appengine/api/datastore.py", line 136, in NormalizeAndTypeCheckKeys 
    keys, multiple = NormalizeAndTypeCheck(keys, (basestring, Entity, Key)) 
    File "/base/python_lib/versions/1/google/appengine/api/datastore.py", line 115, in NormalizeAndTypeCheck 
    (types, arg, typename(arg))) 
BadArgumentError: Expected an instance or sequence of (<type 'basestring'>, <class 'google.appengine.api.datastore.Entity'>, <class 'google.appengine.api.datastore_types.Key'>); received None (a NoneType). 

내 핸들러의 get 메소드에서 transfer_funds를 호출하려고하지만이 오류가 발생,이

#!/usr/bin/env python 

import wsgiref.handlers 
from google.appengine.ext import db 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from models import UserDetails 

def _transfer_funds(src_key,dest_key,amt): 
    def _tx(): 
    account = db.get(src_key) 
    amount = float(amt) 
    if amount <= 100.0: 
     if account.balance < amount: 
     return None 
    account.balance -= amount 
    transfer = Transfer(
     parent = account, 
     amount = -amount, 
     target = db.get(dest_key) 
    ) 
    db.put([account, transfer]) 
    return transfer 
    return db.run_in_transaction(_tx) 

def _roll_forward(transfer): 
    def _tx(): 
    dest_transfer = Transfer.get_by_key_name(str(transfer.key()), parent=transfer.target.key()) 
    if not dest_transfer: 
     dest_transfer = Transfer(
      parent = transfer.target.key(), 
      key_name = str(transfer.key()), 
      amount = -transfer.amount, 
      target = transfer.key().parent(), 
      other = transfer) 
     account = UserDetails.get(transfer.target.key()) 
     account.balance -= transfer.amount 
     db.put([account, dest_transfer]) 
     return dest_transfer 
    dest_transfer = db.run_in_transaction(_tx) 
    transfer.other = dest_transfer 
    transfer.put() 
    return True 

## Model class for Transfers/Transactions 
class Transfer(db.Model): 
    amount = db.FloatProperty(required=True) 
    target = db.ReferenceProperty(reference_class=UserDetails, required=True) 
    other = db.SelfReferenceProperty() 
    timestamp = db.DateTimeProperty(required=True, auto_now_add=True) 

class MyHandler(webapp.RequestHandler): 
    def get(self): 
     src_username = str(self.request.get('from_username')) 
     dest_username = str(self.request.get('to_username')) 
     amt = str(self.request.get('amount')) 
     src_key = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = src_username).get() 
     dest_key = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = dest_username).get() 
     transfer = _transfer_funds(src_key,dest_key,amt) 
     progress = _roll_forward(transfer) 
     srcUserDetails = UserDetails.gql('WHERE user_name = :uname', uname = src_username).fetch(1) 
     destUserDetails = UserDetails.gql('WHERE user_name = :uname', uname = dest_username).fetch(1) 
     values = { 
      'progress': progress, 
      'srcUser': srcUserDetails, 
      'destUser': destUserDetails 
     } 
     self.response.out.write(template.render('transactions.html', values)) 
    def post(self): 
     self.redirect('/transactions.html') 

def main(): 
    app = webapp.WSGIApplication([ 
     (r'.*',MyHandler)], debug=True) 
    wsgiref.handlers.CGIHandler().run(app) 

if __name__ == "__main__": 
    main() 

내가 GAE는 부하가 균형 않는 것을 이해, 내 main.py 파일입니다 요청을하지만 함수 호출까지 확장됩니까? 왜이 오류가 발생하는지 이해하는 데 도움을주십시오.

답변

2

아마의 : 없음

account = db.get(src_key) 

src_key입니까?

src_key = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = src_username).get() 

이 행을 일치되지 않습니다 src_key이 문을 의미 없음, 없기 때문에

+0

아니요, MyHandler에서 할당하는 src_key 값은 데이터 저장소에서 쿼리하는 사용자 이름에 해당하는 유효한 키입니다. – Arun

1

당신이 오류가 나타나는 것입니다. 해당 명령문의 결과와 사용중인 사용자 이름을 기록하고 일치하는 레코드가 있는지 확인하십시오.

관련 문제