django实现用户登陆

首先构建咱们的用户体系

在models里继承AbstractUserhtml

from django.contrib.auth.models import AbstractUser
from django.db import models
import random


# Create your models here.
# 构建咱们的用户
class MyUser(AbstractUser):
    phone = models.CharField(
        max_length=20,
        verbose_name="手机号",
        unique=True
    )
    icon = models.ImageField(
        upload_to='icons',
        null=True
    )

在settings.py中设置前端

AUTH_USER_MODEL = "APP名.类名(MyUser)"

注意:记得执行迁移  如迁移失败,则删除数据库里全部的表从新执行迁移!!!

迁移成功后能够在数据库中看到python

能够看到本身定义的字段,表示继承没问题。

自定义登陆

首先新建一个作登陆认证的.py文件数据库

from django.contrib.auth.backends import ModelBackend
# 导入本身的用户类
from .models import MyUser


class MyBackend(ModelBackend):
    # 复写authenticate
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 思路  1.先找用户 2.在作验证密码


        # 找人
        user = None
        try:
            user = MyUser.objects.get(username=username)
        except:
            try:
                user = MyUser.objects.get(phone=username)
            except:
                return None
        # 作密码验证
        if user.check_password(password):
            return user
        else:
            return None

修改settings.py文件django

# 指定认证的类
AUTHENTICATION_BACKENDS = (
    '你APP的名字.文件名.MyBackend(认证类名)',
)

再在views写逻辑后端

def my_login(req):
    if req.method == 'GET':
        return render(req, 'login.html')
    else:
        params = req.POST
        u_name = params.get('u_name')
        pwd = params.get('pwd')
        # 数据校验
        # 用户校验
        user = authenticate(username=u_name, password=pwd)
        if user:
            # 用户登陆
            login(req, user)
            # 登陆成功返回页面
            return redirect('/dj05app/my_index')
        else:
            return HttpResponse("用户名或者密码错误")

前端登陆代码以下app

<form action="{% url 'dj05app:my_login' %}" method="post" style="text-align: center">
    {% csrf_token %}
    <input type="text" name="u_name" placeholder="用户名或手机号">
    <br>
    <input type="password" name="pwd" placeholder="密码">
    <br>
    <input type="submit" value="登陆">

登陆后的页面跳转(前端)dom

欢迎{{ u_name }}

 

登陆后的页面跳转(后端)post

@login_required(login_url="/dj05app/my_login")
def my_index(req):
    user = req.user
    return render(req, 'index.html', {"u_name": user.username})

注意:ui

@login_required()

做用:保证一个API在用户调用时,保证用户是登陆状态

login_url 参数 指定的值是咱们本身的登陆页面的url

就是指  若是没有用户,则会跳转到登陆页面

 

因为咱们是直接用的登陆,全部用户信息是在后台添加的

添加用户名和密码

添加手机号