PermanentTaskFailure: у объекта 'module' нет атрибута 'Migrate' - PullRequest
9 голосов
/ 23 января 2011

Я использую библиотеку массовых обновлений Ника Джонсона в google appengine (http://blog.notdot.net/2010/03/Announcing-a-robust-datastore-bulk-update-utility-for-App-Engine). Она прекрасно работает для других задач, но по какой-то причине со следующим кодом:

 from google.appengine.ext import db
 from myapp.main.models import Story, Comment
 import bulkupdate

 class Migrate(bulkupdate.BulkUpdater):
     DELETE_COMPLETED_JOBS_DELAY = 0
     DELETE_FAILED_JOBS = False
     PUT_BATCH_SIZE = 1
     DELETE_BATCH_SIZE = 1
     MAX_EXECUTION_TIME = 10

     def get_query(self):
         return Story.all().filter("hidden", False).filter("visible", True)

     def handle_entity(self, entity):
         comments = entity.comment_set
         for comment in comments:
             s = Story()
             s.parent_story = comment.story
             s.user = comment.user
             s.text = comment.text
             s.submitted = comment.submitted
             self.put(s)

 job = Migrate()
 job.start()

Я получаю следующую ошибку вмои журналы:

Permanent failure attempting to execute task
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 258, in post
    run(self.request.body)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 122, in run
    raise PermanentTaskFailure(e)
PermanentTaskFailure: 'module' object has no attribute 'Migrate'

Мне это кажется довольно странным. Очевидно, что класс находится прямо над заданием, он находится в одном файле, и, очевидно, вызывается job.start. Почему он не можетсм. мой класс переноса?

РЕДАКТИРОВАТЬ: я добавил это задание обновления в более новую версию кода, которая не используется по умолчанию. Я вызываю задание с правильным URL-адресом (http://version.myapp.appspot.com/migrate). Возможно ли, что этосвязано с тем, что это не версия по умолчанию, обслуживаемая App Engine?

1 Ответ

7 голосов
/ 24 января 2011

Кажется вероятным, что ваше объявление класса 'Migrate' находится в скрипте-обработчике (например, тот, который напрямую вызывается app.yaml).Ограничением deferred является то, что вы не можете использовать его для вызова функций, определенных в модуле обработчика.

Кстати, моя библиотека массовых обновлений устарела в пользу поддержки mapreduce в App Engine;вы, вероятно, должны использовать это вместо этого.

...