Как мне применить monkeypatch к GAE?

#python #google-app-engine

#python #google-app-engine

Вопрос:

Можете ли вы сказать мне, как мне применить этот патч к Google App engine, например, куда его поместить? Спасибо

 def _user_init(self, email=None, _auth_domain=None,
             _user_id=None, federated_identity=None, federated_provider=None):
  if not _auth_domain:
    _auth_domain = os.environ.get('AUTH_DOMAIN')
  assert _auth_domain

  if email is None and federated_identity is None:
    email = os.environ.get('USER_EMAIL', email)
    _user_id = os.environ.get('USER_ID', _user_id)
    federated_identity = os.environ.get('FEDERATED_IDENTITY',
                                        federated_identity)
    federated_provider = os.environ.get('FEDERATED_PROVIDER',
                                        federated_provider)

  if not email and not federated_identity:
    raise UserNotFoundError

  self.__email = email
  self.__federated_identity = federated_identity
  self.__federated_provider = federated_provider
  self.__auth_domain = _auth_domain
  self.__user_id = _user_id or None

users.User.__init__ = _user_init
  

Комментарии:

1. monkeypatch != patch . Что это?

2. Это называется monkeypatch, где мы получили его в качестве решения здесь groups.google.com/forum /#!topic/google-appengine-python /…

Ответ №1:

Просто используйте его как есть: поместите этот код в модуль, который будет импортирован, прежде чем использовать соответствующий пользовательский модуль или функциональность хранилища данных. Я включил соответствующую строку для исправления кода (последнюю строку) вместе с самим исправлением.

Ответ №2:

Переопределять конструктор подобным образом небезопасно. Если внутренняя реализация пользовательского API изменится в процессе производства, ваше приложение может прерваться без предупреждения.

Чего вы пытаетесь здесь достичь? Я не вижу никакой пользовательской логики; похоже, вы только что скопировали конструктор из SDK дословно. Если вам нужно добавить пользовательскую логику, попробуйте вместо этого создать подкласс UserProperty и / или обернуть вызовы пользовательского API.

Комментарии:

1. Спасибо за ответы. Вот ссылка на фон, где Ник Джонсон отправил нам это в качестве исправления groups.google.com/forum /#!topic/google-appengine-python /…

2. Спасибо, это актуально. По сути, вам просто нужно включить это в свой собственный код после того, как вы импортировали пользователей, но перед первым созданием экземпляра пользовательского объекта. Например, в верхней части вашего main.py после импорта.

Ответ №3:

Я думаю, это относится к какому-то приложению в качестве grep в appengine sdk, поскольку ‘federated_identity’ не дает никаких подсказок. Кстати, вы должны делать то же самое. Grep (или WinGrep) для таких терминов, как «федеративный», чтобы увидеть, можно ли применить этот частичный патч к любому источнику.

Спасибо за обновленную ссылку. Исправление может быть добавлено в файл google/appengine/api/users.py

Возможно, вам просто нужно добавить последнюю строку: users.User.__init__ = _user_init

Я смог разобраться в этом после проверки последнего кода в svn.

Комментарии:

1. Мы получили код в качестве исправления для неизвестной проблемы здесь: groups.google.com/forum /#!topic/google-appengine-python /…

2. Не изменяйте SDK. Весь смысл monkeypatch в том, что он исправляет ошибку без изменения SDK.