Почему модель аутентификации webapp2 использует уникальную таблицу? - PullRequest
4 голосов
/ 15 марта 2012

Я внедряю аутентификацию webapp2 в свою кодовую базу и хотел понять эту причуду:

В models.py я вижу, что в нем говорится:

Чтобы обеспечить уникальность свойства при создании нового User, мы сначала создаем Unique записей для этих свойств, и если все пойдет хорошо, мы можем сохранить новую User запись ::

Мне кажется, что это очень сложный способ проверки уникальности, и, честно говоря, я не совсем понимаю, что делает функция «create_multi» .... может быть, поэтому я немного запутался здесь , Мой мыслительный процесс:

Просто сделайте быстрый запрос, чтобы увидеть, существует ли имя пользователя (auth.id) в хранилище данных. Если нет, то поставьте ().

Я знаю, что что-то упустил, кто-то может мне это объяснить? У меня есть догадка, что, может быть, код был введен там, чтобы было бы легко, если бы люди захотели, иметь несколько уникальных номеров?

спасибо!

p.s. Видимо код webapp2 был вдохновлен этой частью кода .

1 Ответ

5 голосов
/ 17 марта 2012

В этой модели есть два уникальных значения: username и auth_id.

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

Согласен, это очень сложно.Но как еще вы это сделаете?(честный вопрос)

Обновление: подробнее о том, почему именно таким образом проверяется уникальность.

Существует только два способа (безопасно) применить ограничение уникальности хранилища данных: транзакцииили используя ключ объекта.Транзакции ограничены до 5 групп объектов, и, используя ключ, вы ограничены 1 уникальным свойством.Если вы не хотите использовать ключ (потому что, скажем, свойство может быть изменяемым, например, электронное письмо), или вам действительно нужно больше уникальных свойств в том же виде, вам нужно создатьспециализированный вид только для проверки уникальности.Более или менее то, что сделано там в ссылке, которую вы разместили.

...