Таинственное поведение в «попробуй, кроме, наконец» - PullRequest
0 голосов
/ 08 февраля 2012

Извините за смутный заголовок, я не знаю, как еще это сформулировать.

У меня есть обработчик запросов работника, который извлекает данные из URL-адреса, записывает их в хранилище больших двоичных объектов и сохраняет ключ данных blob_key вListProperty в хранилище данных.Я попытался упростить код для ясности здесь:

class Fetch(webapp2.RequestHandler):
    def get(self):

        url = self.request.get('url')
        itemKey = self.request.get('itemKey')
        item = MyModel.get(itemKey)

        try:
            result = urlfetch.fetch(url=url)
            if result.status_code == 200:
                saveDataResult = save_data(result.content, itemKey)
                if saveDataResult is False:
                    raise Exception('error saving data')
            else:
                raise Exception('error fetching data: %s' % result.status_code)

            item.status = 'success'
        except Exception:
            item.status = 'failed'
        finally:
            item.put()

def save_data(data, itemKey)
    try:
        #write data to blobstore and get its blob_key...
        blob_key = files.blobstore.get_blob_key(file_name)
        item = MyModel.get(itemKey)
        item.blobKey.append(blob_key)
        item.put()

        return True
    except:
        return False

Теперь у меня проблема в том, что когда saveDataResult возвращает True, его статус устанавливается в «success», но его свойство blobKey не содержит значениядаже если был создан blob_key и данные успешно записаны.Я не вижу причин, по которым это спасло мою жизнь, пожалуйста, помогите.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

Без гораздо большей информации очень трудно определить, что происходит. Вот мое обоснованное предположение:

MyModel.get(itemKey) вызывается как в get(), так и в save_data(). Я предполагаю, что он возвращает два разных объекта, представляющих элемент. Когда blobKey обновляется в save_data, обновление происходит только в объекте, выбранном в save_data. Когда вы позже исследуете его за пределами этой области, вы смотрите на другой объект.

Будет ли это правильно или нет, будет зависеть от реализации MyModel.get().

Кроме того, вы понимаете, что звоните item.put() дважды, верно?

1 голос
/ 08 февраля 2012

Проблема здесь

finally:
    item.put()

этот единственный вызов переопределяет данные, сохраненные save_data(), потому что он ссылается на более старый объект элемента.

Я бы посоветовал вам обновить статус с save_data(), то есть item.status = 'success' или переместить item = MyModel.get(itemKey) после save_data(), чтобы вы могли получить обновленный объект.

0 голосов
/ 08 февраля 2012

Проблема в том, что когда вы звоните save_data() с item = MyModel.get(itemKey) который снова вызывается из класса Fetch, в результате вы получаете два разных объекта и, следовательно, перезаписываете один в save_data (), и, следовательно, при переходе в хранилище данных вашей модели никакие данные для blobkey не сохраняются как его перезаписанные.

Попробуйте сделать все в классе, или вы не используете item = MyModel.get(itemKey) дважды.

...