9.Django之登陆注册验证注销

792 阅读4分钟
该文章仅供学习,如有错误,欢迎指出

最近自己的博客网站也快完成了,学了好久的bootstrap,之后我会把自己写bootstrap的一些模块贴上来

一个开放的网站当然不仅仅只是单个用户访问,也不是单个用户可以使用,我们需要容纳更多的用户来体验的网站

但是!

为了网站的一定安全,我们需要用户来登陆我们的网站,让管理员能够记录并进行适当的管理

Django很好的为我们设计了一个自带的User用户

创建超级用户!

有一定基础的人一定知道,Django自带一个后台管理系统admin,而要进入这个系统,首先我们需要创建一个超级管理员用户

python manage.py createsuperuser 

之后在浏览器地址栏中输入http://127.0.0.1:8000/admin 就可以访问自己的后台管理系统

创建用户

Django内置了一个User

models.py

from django.contrib.auth.models import User
# Create your models here.
class Users(User):
    name = models.CharField(max_length=20)  #可以自己再添加其他的字段
    message =  models.CharField(max_length=20)
    emails = models.EmailField(default=0)
再次进入后台管理系统的时候我们会发现

这里有两种用户

很显然上面的是我们应用程序下面的用户, 下面的是超级用户管理

但应用程序下的用在手动增加时出现了于超级用户同样的界面

勾选这个,即立刻变身成为超级用户

勾选这个,即立刻可以登陆后台管理系统

这个其实就是,你可以在你的系统下创建多个超级用户并且让他管理这个站点,但是某段时间你不想让他再来管理这个站点,你就可以将这个有效勾去并保存,该用户在你下次勾选之前即使有了其他的特权也无法进入该站点

报错原因

很多人会发现自己在后台手动添加的用户登不上去,其实不难发现的是

这里的密码加密无法识别,你只需要修改密码就可以完全加密了。也可以实现功能了

登陆

这是我的目录

from django.shortcuts import render
from django.contrib.auth.models import  auth
from django.contrib.auth import authenticate,login,logout

# Create your views here.



def auth_test(request):
    if request.method =="POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request,username=username,password=password)
        if user is not None:
            login(request,user)
            return render(request,'polls/load.html')
        else:
            print("登陆错误")
            return render(request,'polls/index.html')
    else:
        return  render(request,"polls/index.html")

def index(request):
    return  render(request,'polls/index.html')

Django自带了登陆、注册、验证、注销等功能

我们只需要引入 django.contrib.auth下的模块

同样的我们之前在管理平台下注册的用户可以在这里实现登陆的功能

注册的问题

之前我们做了一遍在后台管理系统下注册的功能,但是用户注册当然不可能进入后台去注册,那只能作为后台管理员做的工作

那么我们在自己的Template下布置一个注册页面

/views.py


from django.shortcuts import render
from django.contrib.auth.models import  auth
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.hashers import make_password
from .models import Users
def auth_inload(request):
   # user_zhuce = Users.objects.all()
    #print(user_zhuce)
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        email = request.POST['email']
        password = make_password(password) # 将密码转换成为哈希法加密
        Users.objects.create( username = username  ,password=password,name=username,message=password,emails=email)  #用我们自己定义的Users去创建一个
        contact = {
            'alert': username+password+email
        }
        return  render(request,'polls/index.html',context=contact)
    else:
        return  render(request,'polls/inload.html')

我们自己写的Users是继承至User的,因此他可以使用User里面的内容,我们ctrl+左键进去看看他有什么

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username, password and email are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

他继承至AbstractUser

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def get_full_name(self):
        """
        Return the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)

很显然,他的源码里面有各种定义,其中username就是我们的用户名,password是我们密码,is_active就是我们之前的是否活跃 is_staff就是我们的是否为职员,可不可以登陆我们的后台管理系统等等

总结:

我们只需要在前台用户输入自己先要注册的账号密码邮箱以及其他的内容(自定义),使用post传到后台,后台获取相应数据使用模型类users保存到为一个用户,那么这个用户就会进入到我们的系统中。

小结:

关于django用户登陆验证等等的插件还有好多,像django-allauth等,之后会陆续补上,在这里先立个flag哈哈哈哈!