Механизм приложения: TypeError в handlers.py - PullRequest
0 голосов
/ 07 февраля 2011

У меня проблема с обработчиком форм в движке приложения (Python). В основном, когда я отправляю форму обработчику, я получаю следующую трассировку:

INFO 2011-02-07 14: 06: 59,364 dev_appserver.py:3317] "GET /favicon.ico HTTP / 1.1" 404 - Traceback (последний вызов был последним):

Файл "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wsgiref/handlers.py", строка 92, в работе self.result = приложение (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 голосов
/ 07 февраля 2011

У класса RequestHandler есть метод с именем error

ошибка (код)

Сокращенный метод, используемый обработчиками для возврата ответа об ошибке. Очищает поток вывода ответа и устанавливает код ошибки HTTP на код. Эквивалентно вызову self.response.clear () и self.response.set_status (code).

Ваш обработчик POST выше перезаписывает этот метод логическим значением, а затем, когда платформа пытается вызвать self.error(500), он вызывает исключение, потому что значение self.error больше не является вызываемым.

Используйте имя переменной члена, отличное от error, чтобы предотвратить это.

...