בdjango מודול ניהול המשתמשים די מתוחכם ומלא, אבל חסרה לו פונקציה בסיסית של אימות משתמש לפי מייל במקום לפי שם. מכיוון שזה שימוש שהולך ונהיה פופולרי באתרים ומכיוון שכמעט לא מצאתי דוגמאות קוד בעברית, החלטתי לכתוב בקצרה איך עושים את זה.
ברמה התחתונה משתמשים מזוהים ע"י שימוש בauthentication backend, שהם מודולים שמממשים קריאות מסויימות. מכיוון שמה שאנחנו עושים קרוב מאוד לשימוש הרגיל החלטתי לא לכתוב מההתחלה מודול שלם, אלא לרשת מהמודל הדיפולטיבי ופשוט לממש קריאה קצרה לזיהוי מייל במקרה שמזהים מייל בשם המשתמש.
שני דברים הנחו אותי בכתיבה:
1. אפשר לזהות מייל בכל מיני שיטות שונות ומתוחכמות. לא הכרחי ולא תמיד יעיל – החלטתי לחפש @ בשם המשתמש – דבר שאסור לפי החוקים במערכת שלי.
2. ליתר בטחון כמעט בכל מעבר (לא מצאתי @, לא מצאתי מייל וכו) – אני מעביר את הקריאה להמשך טיפול רגיל. במקרה הגרוע פגעתי בביצועים בעיקר בחיפוש אחד נוסף.
הנה הקוד:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class EmailUserBackend(ModelBackend):
def authenticate(self, username=None, password=None):
if '@' in username:
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
pass
return super(EmailUserBackend,self).authenticate(username, password)
בנוסף, צריך להחליף את הקוד הנוכחי בsettings.py:
AUTHENTICATION_BACKENDS = ( 'gifts.giftuser.backend.EmailUserBackend', #'django.contrib.auth.backends.ModelBackend', )
בהערה: הקוד הקודם.


