前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django 使用邮箱登录(扩展用户表、继承 AbstractUser)

django 使用邮箱登录(扩展用户表、继承 AbstractUser)

作者头像
卓越笔记
发布2023-02-18 09:45:12
7830
发布2023-02-18 09:45:12
举报
文章被收录于专栏:卓越笔记

# 前提

   继承 django 自带的用户类(AbstractUser)

# 环境

  1. python: 3.6.x

  2. django==1.11.22

# apps/users/models.py

代码语言:javascript
复制
from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.

class UserProfile(AbstractUser):
    """
    用户
    """
    gender_choice = (
        ("1", "男"),
        ('0', "女"),
    )

    email = models.EmailField(verbose_name='邮箱', max_length=255, unique=True)
    phone = models.CharField(verbose_name="手机号码", max_length=50, null=True, blank=True)
    avatar = models.URLField(verbose_name="用户头像", default="http://photo.xxx.top/avatar_default.png")
    gender = models.CharField(max_length=32, choices=gender_choice, default="男", verbose_name="性别")
    time_black = models.DateTimeField(verbose_name="下次可访问时间", blank=True, null=True)
    last_ip = models.GenericIPAddressField(verbose_name="上次访问IP", default="0.0.0.0")

    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = "用户信息列表"

    def __str__(self):
        return "%s-%s %s" % (self.username[0].upper(), self.last_name, self.first_name)

# apps/users/views.py(不局限于邮箱,也可以改成 手机号码等等,但是要注意字符类型)

代码语言:javascript
复制
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import UserProfile


# Create your views here.


# 让用户可以用邮箱登录
# setting 里要有对应的配置 AUTHENTICATION_BACKENDS
class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

注意:当报错误 {"non_field_errors":["无法使用提供的认证信息登录。"]},请尝试在 authenticate 里面加上 request,如:authenticate(self, request, username=None, password=None, **kwargs)

# settings.py

代码语言:javascript
复制
ALLOWED_HOSTS = ["*"]

AUTH_USER_MODEL = 'users.UserProfile'

AUTHENTICATION_BACKENDS = (
    'apps.users.views.CustomBackend',  # AUTH 方法(支持邮箱登录),CustomBackend 的路径
)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-7-25 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档