Email как имя пользователя в Django - PullRequest
18 голосов
/ 23 августа 2010

Хорошо, этот довольно очевиден для всех, кто использует Django и часто спрашивается новичками, но я хотел бы прояснить и обсудить, есть ли другие способы сделать это. В настоящее время наиболее распространенным и удобным подходом является хранение электронной почты в поле имени пользователя, поскольку Django 1.2 допускает символы «@», «_» и «-», но при этом возникают следующие проблемы:

  1. Хуже всего: поле имени пользователя ограничено свойством max_length=30, которое смехотворно мало для писем. Даже если вы переопределите проверку формы, DB будет иметь varchar(30) вместо EmailField varchar(75), если вы не измените свою таблицу вручную.
  2. Вам необходимо хранить данные электронной почты как в поле имени пользователя, так и в поле электронной почты, чтобы User.email_user() работал. Я думаю, что есть и другие места, когда используется User.email.
  3. Ошибка чтения кода. Конечно, другие djangonauts знают об этой ловушке, но обработка поля с именем 'username' (особенно, когда поле email еще есть), поскольку электронная почта, очевидно, делает ваш код менее понятным.

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

authenticate(self, email=None, password=None)
  1. User.email не имеет свойства unique=True, что означает, что ваша БД не будет иметь индекса, что делает поиск по электронной почте медленным, как ад.
  2. Вы должны иметь дело с полем username, которое имеет unique=True, полностью удалив его из таблицы или изменив его на NULL и удалив индекс.

Возобновление, оба пути являются злыми и требуют выполнения специфичного для БД кода после syncdb, что недопустимо, если вам требуется независимое от БД приложение.

Ответы [ 3 ]

6 голосов
/ 04 февраля 2012

Я упаковал django-email-as-username , который в значительной степени должен делать все, что вам нужно, если вы хотите удалить имена пользователей, и использовать только электронные письма.

краткий обзор:

  1. Обеспечивает поддержку и вспомогательные функции аутентификации электронной почты для создания пользователей.
  2. Исправляет администратора Django для обработки аутентификации пользователей на основе электронной почты.
  3. ПропускаетКоманда createuperuser для создания пользователей только с электронной почтой.
  4. Рассматривает аутентификацию электронной почты как нечувствительную к регистру.

Под скрытыми именами пользователей находятся хэшированные версии электронных писем, что означает, что мыне ограничен пределом имени пользователя в Django 30 символов (только обычный предел электронной почты в 75 символов).

Edit : Начиная с Django 1.5, вы должны рассмотреть возможность использования пользовательской модели пользователя вместопакет 'django-email-as-username'.

5 голосов
/ 23 августа 2010

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

Вход в систему с адресами электронной почты в Django

Если имя для входа, указанное в форме, является электронным письмом (содержит символ «@»), оно попытается выполнить аутентификацию с этим именем и обратится к имени пользователя, если это не электронное письмо. (Естественно, вам просто нужно убедиться, что ваша регистрационная форма содержит электронное письмо для этой работы.)

0 голосов
/ 23 августа 2010

Что ж, мне не приходилось использовать электронную почту в качестве имен пользователей в Django, но я думаю, вы могли бы создать модель UserProfile и объединить в нее поля, например другое поле электронной почты, и сделать его уникальным.Таким образом, вы можете использовать user.get_profile (). Email для вашей аутентификации.

Я думаю, что другим способом было бы унаследовать User и переопределить поля, но я думаю, что это все еще не рекомендуется разработчиками Django.

Наконец, вы можете определить собственную модель пользователя и вернуться к django.contrib.auth.models.User для некоторой логики.

Код для изменения таблицы пользователей в Django:

 from django.db import connection
 cursor = connection.cursor()
 cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...