Подтвердить что ты не робот

Электронная почта как имя пользователя в Django

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

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

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

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

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

4b9b3361

Ответ 1

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

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

  • Предоставляет встроенные функции электронной почты и вспомогательные функции для создания пользователей.
  • Патчи администратора Django для проверки подлинности пользователя на основе электронной почты.
  • Передает команду createuperuser для создания пользователей только с электронной почтой.
  • Рассматривает аутентификацию по электронной почте как независимую от регистра.

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

Изменить: по состоянию на Django 1.5 вы должны изучить пользовательскую модель пользователя вместо пакета django-email-as-username.

Ответ 2

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

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

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

Ответ 3

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

Я предполагаю, что другим способом было бы наследовать пользователя и переопределять поля, но я думаю, что это все еще не рекомендуется разработчиками 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")