Django用户通过电子邮件登录&密码

时间:2014-09-26 00:55:54

标签: python django

我刚刚完成了Django教程,想要创建一个网站,要求用户使用电子邮件地址和密码登录。这与Django强大的内置管理站点完全分开(只有一两个特殊人员可以访问管理员)。

我的问题是:

  1. 我应该创建一个单独的数据库表来存储用户凭据,信息等吗?或者我应该使用现有的Django表吗?

  2. 如上所述,用户应使用电子邮件地址登录。这会是Django的问题吗?

  3. 非常感谢其他最佳做法。谢谢。

3 个答案:

答案 0 :(得分:3)

用户登录不需要单独的表。只需利用Auth framework允许用户使用他们的电子邮件地址登录非常简单,但有几种不同的方法可以解决这个问题。您需要先从:https://docs.djangoproject.com/en/1.7/topics/auth/customizing/

开始

答案 1 :(得分:1)

首先是什么是中间件 它是一个轻量级的低级“插件”系统,用于全局改变Django的输入或输出。

你可以在这里阅读如何activating-middleware

创建电子邮件后端middleware将帮助您根据电子邮件地址作为用户名对用户进行身份验证

    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None 

答案 2 :(得分:0)

布兰登是对的, 最简单的方法是自定义后端而不是Django默认值 我们这样做吧 在您的settings.py中:

AUTHENTICATION_BACKENDS = ('accounts.backend.EmailOrUsernameModelBackend')

然后在accounts / backend.py中:

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend as _ModelBackend

User = get_user_model()


class EmailOrUsernameModelBackend(_ModelBackend):
    """ Authenticate user by username or email """

    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
            kwargs = {'username': username}
        try:
            user = User.objects.get(**kwargs)
            if user.check_password(password):
                return user
            else:
                return None
        except User.DoesNotExist:
            return None

    def get_user(self, user_id=None):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

现在您可以使用您的用户名或电子邮件登录 玩得开心