Ошибка типа при использовании хранилища данных GAE и пространств имен - не удается получить объект - PullRequest
0 голосов
/ 22 апреля 2011

Я пытаюсь получить некоторую информацию OAuth, которую я сохранил с помощью Datastore, но я получаю эту ошибку, когда создаю экземпляр своего класса OAuthConsumer:

TypeError: __init__() got an unexpected keyword argument 'consumer_secret'

Это также мой первыйвремя экспериментировать с Namespace, и мне интересно, имеет ли это какое-то отношение к этому.Класс выглядит следующим образом:

creds = OAuthConsumer('google')

class OAuthConsumer(db.Model):
    '''the oauth consumer information'''
    consumer_key = db.StringProperty()
    consumer_secret = db.StringProperty()

    def __init__(self, service):
        namespace_manager.set_namespace(service)
        query = db.GqlQuery('SELECT * FROM OAuthConsumer')
        creds = query.get()
        self.consumer_key = creds.consumer_key
        self.consumer_secret = creds.consumer_secret

Вот что я получил, используя Data Viewer:

credentials are blocked out

Любые идеи относительно того, что я делаю неправильно

1 Ответ

3 голосов
/ 22 апреля 2011

Вы переопределяете метод __init__ в классе модели хранилища данных и не передаете аргументы ключевого слова родительскому конструктору (или вообще не вызываете его!).

Как правило, вы не должны переопределять конструктор класса Модель хранилища данных. Можно сделать это правильно, но это сложно, и гораздо безопаснее предоставить метод класса как фабрику, например:

class OAuthConsumer(db.Model):
    '''the oauth consumer information'''
    consumer_key = db.StringProperty()
    consumer_secret = db.StringProperty()

    @classmethod
    def new(cls, service):
        namespace_manager.set_namespace(service)
        query = db.GqlQuery('SELECT * FROM OAuthConsumer')
        creds = query.get()
        return cls(consumer_key=creds.consumer_key, consumer_secret=creds.consumer_secret)

creds = OAuthConsumer('google')

Ваш код более чем несколько странен по нескольким причинам:

  • При создании нового экземпляра вы выбираете и копируете поля из другого, (эффективно) случайно выбранного экземпляра той же модели!
  • Вы устанавливаете пространство имен внутри конструктора (или в переписанной версии, в заводском методе). Пространство имен является глобальным параметром, и вы действительно не должны делать это внутри метода библиотеки. Вы также не установите его позже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...