App Engine:handlers.py中的TypeError

0 投票
1 回答
698 浏览
提问于 2025-04-16 11:23

我在应用引擎(Python)中的一个表单处理程序遇到了问题。简单来说,当我把表单提交到处理程序时,出现了以下错误信息:

INFO 2011-02-07 14:06:59,364 dev_appserver.py:3317] "GET /favicon.ico HTTP/1.1" 404 - 错误追踪(最近的调用在最前面):

文件 "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wsgiref/handlers.py",第 92 行,在 run self.result = application(self.environ, self.start_response)

文件 "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py",第 531 行,在 __call__ handler.handle_exception(e, self.__debug)

文件 "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py",第 394 行,在 handle_exception self.error(500) 类型错误:'bool'对象不可调用

INFO 2011-02-07 14:07:01,986 dev_appserver.py:3317] "POST /newevent HTTP/1.1" 500 -

在浏览器中,我看到的信息是“发生了服务器错误。请联系管理员”。可以看出,错误发生在 POST 命令之前,似乎并不是我的处理程序代码引起的。以下是该表单的处理程序类(post_secure 是父类中的 post 方法调用的一个方法):

class SaveEvent(BaseHandler):
def post_secure(self):
    userinfo = db.GqlQuery("SELECT * FROM User WHERE fbid = :1", self.user['uid'])[0]
    newevent = Event(parent=userinfo)
    self.error = False
    self.template_values = {}

    if (self.request.get('eventname') == ""):
        self.template_values['eventnameerror'] = True
        self.error = True
    else:
        newevent.eventname = self.request.get('eventname')

    if (self.request.get('venuename') == ""):
        self.template_values['venuenameerror'] = True
        self.error = True
    else:
        newevent.venuename = self.request.get('venuename')

    if (re.match("[0-9]+\.[0-9][0-9]", self.request.get('eventprice')) == None):
        self.template_values['eventpriceerror'] = True
        self.error = True
    else:
        newevent.price_pence = int(float(self.request.get('eventprice')) * 100)

    if (re.match("[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]", self.request.get('eventdate')) == None):
        self.template_values['eventdateerror'] = True
        self.error = True
    else:
        day = re.split("/", self.request.get('eventdate'))[0]
        month = re.split("/", self.request.get('eventdate'))[1]
        year = re.split("/", self.request.get('eventdate'))[2]

    if (re.match("[0-2][0-9]:[0-5][0-9]", self.request.get('eventtime')) == None):
        self.template_values['eventtimeerror'] = True
        self.error = True
    else:
        hours = re.split(":", self.request.get('eventtime'))[0]
        minutes = re.split(":", self.request.get('eventtime'))[1]

    try:
        newevent.date = datetime.datetime(year, month, day, hours, minutes, 0, 0)
    except ValueError:
        self.template_values['eventdatetimeerror'] = True
        self.error = True

    if (newevent.date < datetime.datetime.now()):
        self.template_values['eventdateerror2'] = True
        self.error = True

    if (self.request.get('eventlink') == ""):
        self.template_values['eventlinkerror'] = True
        self.error = True

    if (self.error == True):
        self.template_values['eventname'] = self.request.get('eventname')
        self.template_values['venuename'] = self.request.get('venuename')
        self.template_values['eventprice'] = self.request.get('eventprice')
        self.template_values['eventdate'] = self.request.get('eventdate')
        self.template_values['eventtime'] = self.request.get('eventtime')
        self.template_values['eventlink'] = self.request.get('eventlink')
        self.tpl('addevent.html', self.template_values)

    newevent.put()

    self.template_values = {
        'newevent' : newevent
    }

    self.tpl('eventadded.html', self.template_values)

1 个回答

2

RequestHandler 类里面有一个叫 error 的方法。

error(code)

这是一个方便的快捷方法,供处理程序用来返回错误响应。它会清空响应输出流,并把HTTP错误代码设置为你传入的code。相当于调用 self.response.clear()self.response.set_status(code)

你上面的POST处理程序把这个方法给覆盖成了一个布尔值(true或false),结果当框架试图调用 self.error(500) 的时候,就会抛出一个异常,因为此时 self.error 已经不再是一个可以调用的方法了。

为了避免这种情况,建议使用一个不同的变量名,而不是 error

撰写回答