Django: تغيير/السماح لاسم المستخدم بتسجيل الدخول للمستخدم لاستخدام بريده الإلكتروني أيضًا
-
28-09-2019 - |
سؤال
كما يقول عنواني ، أريد أن أعرف ما إذا كانت هناك طريقة للسماح للمستخدم باستخدام ليس فقط اسم المستخدم الخاص به ، ولكن أيضًا على بريده الإلكتروني لتسجيل الدخول. أرغب في توحيد إجراء تسجيل الدخول لأنني في الوقت الحالي ، استخدم مستخدمي العديد من الاتفاقيات المختلفة ويصبح فوضويًا جدًا.
المحلول
ربما يمكنك القيام بذلك إذا قمت بفرض عناوين بريد إلكتروني فريدة. بمعنى عدم وجود مستخدم يمكن أن يكون له نفس عنوان البريد الإلكتروني. وبهذه الطريقة ، يمكنك جلب المستخدم عن طريق عنوان البريد الإلكتروني وتسجيل الدخول.
قد يبدو النموذج شيئًا كهذا:
<form method="post" action="{% url myproject.views.login %}">
<p>Username</p>
<input type='text' name='username'/>
<p>Password</p>
<input type='password' name='password'/>
<input type="submit" value="Login"/>
</form>
قد تبدو طريقة العرض شيئًا من هذا القبيل:
def login( request ):
username = request.POST['username']
password = request.POST['password']
user = User.objects.filter( email = username )[0]
if( user is not None ):
# -- the user was retrieved by an email address
# -- now you can authenticate and log them in log them in
from django.contrib import auth
user = auth.authenticate( user.username, password )
if( user is not None ):
auth.login( user, request )
قد يكون OpenID وسيلة أخرى للذهاب: http://bit.ly/a2olhx
تأكد من عناوين البريد الإلكتروني الفريدة لكل مستخدم: http://bit.ly/aoaabw
نصائح أخرى
أعتقد أنني "حلت" مشكلتي ، على الأقل أنها وظيفية ، في الوقت الحالي. قررت استخدام الواجهة الخلفية المصادقة الخاصة بي. لقد قمت بإنشاء ملف "Auth_backends.py" وأضفته إلى Authentication_BackEnds في الإعدادات الخاصة بي.
تحتوي حقول نموذج تسجيل الدخول الخاصة بي على "اسم المستخدم" وكلمة المرور فقط. الطريقة الوحيدة التي أقوم بها للتحقق مما إذا كان اسم المستخدم الذي تم إدخاله هو في الواقع اسم المستخدم أو البريد الإلكتروني ، هو القيام بـ .find ('@'). هل هناك طريقة أفضل للتحقق من ذلك؟ هل سيكون هذا كافيًا؟ السبب كله في القيام بذلك هو أنه من الأسهل على المستخدم أن يتذكر بريده الإلكتروني من اسم المستخدم الخاص به (وهو في الواقع "معرف" يتكون من أرقام).
سأضطر أيضًا إلى رعاية رسائل البريد الإلكتروني المكررة.
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User
class CustomUserModelBackend(ModelBackend):
def authenticate(self, **credentials):
if 'username' in credentials:
if credentials['username'].find('@') > 0:
return self.authenticate_by_email(**credentials)
else:
return self.authenticate_by_username(**credentials)
def authenticate_by_username(self, username=None, password=None):
try:
user = User.objects.get(username=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def authenticate_by_email(self, username=None, password=None):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None