2012-03-15 2 views
3

Я реализация webapp2 авторизации в мой код, и хотел понять эту странность:Почему модель webapp2 auth использует уникальную таблицу?

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

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

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

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

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

спасибо!

p.s. По-видимому, код webapp2 был вдохновлен this piece of coding.

ответ

4

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

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

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

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

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

+0

эй, поэтому в моем приложении (предоставленном, а не в случае использования всех приложений) ** email является именем пользователя и auth_id **. Итак, с этой точки зрения я собирался предложить просто сделать запрос для всех auth_ids, чтобы узнать, соответствует ли какой-либо новый, введенный пользователем. – iceanfire

+0

Вот мое мнение о том, почему вы подчеркиваете транзакции: если мы не используем транзакции, если две регистрации пытаются зарегистрировать одно и то же имя пользователя в той же миллисекунде, это может позволить дублировать, если мой метод был использован? Дайте мне знать, если я на правильном пути. благодаря! – iceanfire

+0

Да, вы не можете обеспечить уникальность, основанную исключительно на запросе без транзакции. Я обновил ответ, чтобы объяснить это. – moraes

Смежные вопросы