Django使用自己的用户系统

用过django的人应该都会知道admin,不过,需求是多变的,比如,你有一个变态的用户系统,用户可能有大中小三张头像,除了fisrt name ,last name外还有middle name,T^T name巴拉巴拉,django 的用户系统可能满足不了你的需求,这时候需要用自己的用户系统了,如何能在满足需求的时候充分又利用到django的用户系统?

django使用自己的用户系统
step-1 写自己的auth模块(定义user class)
step-2 admin.py 注册到django的admin后台,并且修改一些field
step-3 修改settings.py中相应配置

django使用自己的用户系统
用过django的人应该都会知道admin,什么,真的没用过?汗,如果这样的话先看看这个
https://docs.djangoproject.com/en/1.6/ref/contrib/admin/

django自带用户系统,通过上面的admin,以及auth可以方便的管理用户。

不过,需求是多变的,比如,你有一个变态的用户系统,用户可能有大中小三张头像,
除了fisrt name ,last name外还有middle name,T^T name巴拉巴拉,django
的用户系统可能满足不了你的需求,这时候需要用自己的用户系统了,如何能在满足
需求的时候充分又利用到django的用户系统?

官方文档如下,内有详细说明,有英文厌烦症的可以直接略过
https://docs.djangoproject.com/en/dev/topics/auth/customizing/

其实步骤很简单

写自己的auth模块(定义user class);
admin.py 注册到django的admin后台,并且修改一些field
修改settings.py中相应配置
step-1 写自己的auth模块(定义user class)
新建一个模块,名字随意,假设叫做myauth

User class继承AbstractBaseUser,UserManager继承BaseUserManager
重写对应的方法,建议浏览下AbstractBaseUser, BaseUserManager的源码

User类不用说,也就是根据自己业务定义的用户class,Manager就是django中
的Manager,做的事情你肯定经常用到,obj.objects.filter(),其中的objects
就是Manager,文档如下
https://docs.djangoproject.com/en/dev/topics/db/managers/

code

# -*- coding: utf-8 -*-
from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)


class UserManager(BaseUserManager):

def create_user(self, name, email, password=None):

if not email:
            raise ValueError('Users must have an email address')

user = self.model(
            name=name,
            email=UserManager.normalize_email(email),
        )

user.set_password(password)
        user.save(using=self._db)
        return user

def create_superuser(self, name, email, password=None):

user = self.create_user(name, email, password)
        user.is_admin = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser):
    '''用户表'''

name = models.CharField(max_length=100, unique=True)
    email = models.EmailField(max_length=100, unique=True)
    avatar = models.URLField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_delete = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    access_token = models.CharField(max_length=100, blank=True)
    refresh_token = models.CharField(max_length=100, blank=True)
    expires_in = models.BigIntegerField(max_length=100, default=0)

objects = UserManager()

USERNAME_FIELD = 'name'
    REQUIRED_FIELDS = ('email',)

class Meta:
        ordering = ('-created_at',)

def __unicode__(self):
        return self.name

def get_full_name(self):
        return self.email

def get_short_name(self):
        return self.name

def has_perm(self, perm, obj=None):
        return True

def has_module_perms(self, app_label):
        return True

@property
    def is_staff(self):
        return self.is_admin

重写的字段看下源码就可以解释到了:

1. AbstractBaseUser已经有password, last_login,所以密码这些就不用费心了
2. 由于get_username用到了self.USERNAME_FIELD,所以需要指明哪个字段为用户名
3. get_short_name,get_full_name需要实现,否则会抛异常
4. 其他就按照自己的业务来写即可
5. UserManager重写下两个create方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a9e0518e8769cb5bcfe4a839a814e08e.html