Используя электронную почту вместо имени для входа в систему в django

Во-первых, это не вопрос, как пройти проверку подлинности на паре электронной почты/пароля, а скорее как произвести логичный, и если Вам нравится, красивая структура данных.

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

  1. поле подлинного User.username max_length является 30 символами, которые не могли бы быть достаточно для некоторых адресов электронной почты.

  2. подлинный User.email не уникален - который является, очевидно, не удовлетворительным для предпосылки, говоря, что имена пользователей должны быть уникальными.

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

  1. Генерируйте уникальное имя пользователя для подлинного User.username - md5, хеш электронной почты должен быть прекрасным здесь?
  2. Не учтите абсолютно подлинный User.email пустой - так как это - только 75 символов в длину, в то время как согласно RFC 5321 (Какова максимальная длина действующего электронного адреса?) электронная почта может быть целых 256 символами.

Следующие проблемы происходят от предлагаемого решения:

  1. Каждый не собирается быть способным снова использовать встроенные представления/шаблоны для стандартных операций как сброс пароля и т.д.
  2. В случае подлинного User.username изменения электронной почты должен будет быть обновлен

Для добавления нефти в огонь, django разработчики вряд ли зафиксируют это ограничение в любом обозримом будущем - см. http://code.djangoproject.com/ticket/11365

Таким образом, вопрос: там какой-либо другой путь состоит в том, чтобы сделать это, и Вы видите какие-либо другие недостатки в решении, предложенном выше?

Спасибо!

7
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

У меня был клиент с коммерческим сайтом, который работал с 1995 года (да, мы говорим здесь о первых последователях). В любом случае, у них уже была устоявшаяся база пользователей, и имена полностью не соответствовали идее Django об имени пользователя.

Я рассмотрел несколько способов справиться с этим, и все они были похожи на хакерские (это было летом 2007 года), поэтому я сказал «к черту» и взломал contrib.auth.models.User напрямую. Мне нужно было всего лишь изменить около 10 строк кода, увеличить размер поля и настроить валидатор. С тех пор мы сделали два обновления - 0.97-pre => 1.0 и 1.0 => 1.1.1 - и каждый раз на «перенос хака» уходило всего около 15 минут.

Это некрасиво, и я могу сгореть в аду за то, что сделал это таким образом, но на то, чтобы сделать это таким образом, потребовалось меньше времени, чем что-либо еще, что я мог понять, а прямые порты не были проблемой.

5
ответ дан 7 December 2019 в 05:21
поделиться

Попробуйте:

template <typename T>
class Base {
  public:
    template <typename U>
    class Nested { };
};

template <typename T>
class Derived : public Base<T> {
  public:
    //How do we typedef of redefine Base<T>::Nested?
    //using Base<T>::Nested; //This does not work
  //using Base<T>::template<typename U> Nested; //Cannot do this either
  //typedef typename Base<T>::template<typename U> Nested Nested; //Nope..

    //now we want to use the Nested class here
  template <typename U>
  class NestedDerived : public Base<T>::template Nested<U> { };
};

int main()
{
  Base<int>::Nested<double> nested;

  Derived<int>::NestedDerived<double> nested_derived;

  return 0;
}

Скомпилировано с помощью gcc 4,3,3 на slackware 13

-121--3926320-

Хорошо, что в переполнении стека есть много знаний по этой теме.

Я думаю, что лучшая статья, в которой излагается дух REST и как он сравнивается с такими технологиями, как SOAP, это Как я объяснил REST своей жене .

В отличие от SOAP, REST не является стандартом, это скорее подход, ориентированный на ресурсы и то, что вы можете сделать с ресурсами. Команды HTTP GET, POST, PUT и DELETE являются типичными действиями, которые можно применить к любому ресурсу. SOAP является стандартом, который игнорирует эти глаголы и изобрел более полный протокол, который работает поверх наиболее популярного глагола HTTP POST для максимальной совместимости. В большинстве случаев эта добавленная сложность является ненужной, и простого запроса HTTP GET для ресурса обычно достаточно для достижения эквивалентного результата, что может быть 1 КБ + SOAP + XML.

Вы также можете просмотреть блог Роя Филдинга (изобретателя REST) для получения дополнительной информации о том, что это значит.

-121--2299979-

Я тоже должен признаться, что буду гореть в аду. Недавно я развернул небольшое приложение, в котором отключил электронную почту пользователя, разделил ее на 30 символов и установил в качестве имени пользователя. Я подумал ад, каковы шансы? и прошел с ним. Взял несколько строк кода и вуаля.

Я думаю, что 75 символ был набором как таковой, потому что люди обычно не имеют личных сообщений электронной почты так долго. Это просто вопрос сохранения пространства, потому что все эти неиспользуемые байты будут зарезервированы в любом случае (т.е. значения NULL и короче/меньше не являются свободными).

0
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: