django实现用户登录

首先构建我们的用户体系

在models里继承AbstractUser

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)"

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

迁移成功后可以在数据库中看到

可以看到自己定义的字段,表示继承没问题。

自定义登录

首先新建一个做登录认证的.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文件

# 指定认证的类
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("用户名或者密码错误")

前端登录代码如下

<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="登录">

登录后的页面跳转(前端)

欢迎{{ u_name }}

登录后的页面跳转(后端)

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

注意:

@login_required()

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

login_url 参数 指定的值是我们自己的登录页面的url

就是指  如果没有用户,则会跳转到登录页面

由于我们是直接用的登录,所有用户信息是在后台添加的

添加用户名和密码

添加手机号

猜你喜欢

转载自blog.csdn.net/ding_312/article/details/81583679