Django Auth 登录认证

  • 用户模型:用户认证、登录、退出等
  • 后台管理:用户管理、权限分配
  • Django自带一个用户认证系统,用于处理账号、组、权限以及基于Cookie的用户会话

1.1 安装与配置


'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',

'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',

python manage.py makemigrations
python manage.py migrate

1.2 Auth 用户类型

  • 注册用户(User),超级用户,普通用户
  • 游客(AnonymousUser)

1.3 Auth 常用字段含义

序号字段说明1

用户名2

登录密码3

邮箱4

姓6is_superuser是否是超级管理员账号/admin7is_staff是否可以访问admin管理后台8is_active是否是活跃用户,默认为True,一般不删除,而是将用用户的is_active设置为False9is_authenticated用户是否已登录的只读属性10is_anonymous用户是否登录失效的只读属性11date_joined用户创建的时间12last_login上一次登录时间13groups用户组多对多关系14user_permission用户权限多对多关系

2.1 创建用户

  • *创建普通用户
from django.contrib.auth.models import User

User.objects.create(username="AA",password="123")

User.objects.create_user(username="AA",password="123")
  • *创建超级用户
from django.contrib.auth.models import User

User.objects.create_superuser(username="AA",password="123")

2.2 删除用户

建议使用: 伪删除,即将is_active修改为False

from django.contrib.auth.models import User

try:
    user = User.objects.get(username = "用户名")
    user.is_ active = False
    user.save()
    print("删除用户成功")
except:
    print("删除用户失败,或该用户不存在")

注意: 不可用update来更新,User不能用。

user = User.objects.get(username = "用户名")
user.update(is_active=True)
"""
Traceback (most recent call last):
  File "", line 1, in
AttributeError: 'User' object has no attribute 'update'
"""

2.3 密码管理

  • 修改密码
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
from django.contrib.auth.models import User

try:
    user = User.objects.get(username="用户名")
    user.set_password("明文密码")
    user.save()
    return HttpResponse("修改密码成功")
except:
    return HttpResponse("修改密码失败")
  • 校验密码是否正确
u = User.objects.get(username='aa')
u.check_password('my password')

3.1 authenticate 登录校验

from django.contrib.auth import authenticate
user = authenticate(username = username,password=password)

说明: 若用户名密码校验成功则返回对应的user对象,否则返回None。

from django.contrib.auth import authenticate
user = authenticate(username="AA",password="123")

user
<User: AA>

3.2 Auth 登录状态保持

from django.contrib.auth import login
from django.contrib.auth import authenticate

def login_view(request):
    ...

    user = authenticate(username="用户名",password="密码")
    ...

    login(request,user)

注: 保存的方式为session,且时间不可以控制,当session什么时候过期,那么就什么时候断开。

3.3 Auth 登录状态校验

同前,用django自带登录状态校验装饰器,实现登录状态的校验。哪个视图需要,就放在哪个视图之前。

  • 未登录需要跳转地址,需要在settings.LOGIN_URL中设置
import django.contrib.auth.decorators import login_required

@login_required
def index_view(request):

    login_user = request.user
    ...

3.3 Auth 登录状态取消

from django.contrib.auth import logout
def logout(request):
    logout(request)

  • 引用的相关库

from django.contrib.auth.models import User

from django.contrib.auth.decorators import login_required

from django.contrib.auth import login,logout,authenticate
def reg_view(request):

    if request.method == "GET":
        return render(request,"reg_view")
    elif request.method == 'POST':
        username = request.POST.get("user")
        pwd1 = request.POST.get("pwd1")
        pwd2 = request.POST.get("pwd2")
        if not User.objects.filter(uesename=username):
            if pwd1 == pwd2:

                user = User.objects.create_user(username=username,password=pwd1)
            else:
                return HttpResponse("密码不一致,请重新输入")
        else:
            return HttpResponse("该用户名已注册,请重新输入")

        return HttpResponseRedirect("/login")
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username,password=password)
        if not user:

            return HttpResponse("用户名或密码错误")
        else:

            login(request,user)
            return HttpResponseRedirect("/index")
def logout(request):
    logout(request)
    return HttpResponseRedirect("/login")

@login_required()
def index_view(request):

    user = request.user
    return render(request,"index.html")

当我们要使用如手机号字段时,发现用户字段不够用,这时就需要想办法来增加字段。

  • 方案1:通过建立新表,与内建表做一对一验证
  • 应用时查询较麻烦
  • 方案2:继承内建的抽象 User模型类
  • 继承现有的模型字段到一个新表,将我们的表告知 Django将原 User模型类替换为 SelfUser模型类

  • step1:添加新应用

  • step2:定义模型类,继承 AbstractUser

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

class UserInfo(AbstractUser):

    phone = models.CharField(max_length=11,default="")
  • step3: settings.py中指明 AUTH_USER_MODDEL="&#x5E94;&#x7528;&#x540D;.&#x7C7B;&#x540D;"

AUTH_USER_MODEL = 'appname.UserInfo'
  • step4:最好在 首次执行数据库迁移命令。

注意: 此流程最好要在第一次 migrate时执行,否则用方案1合适。后面一切调用模型类时就应该是UserInfo这个模型类了。

–添加新用户–

from user.models import UserInfo
user = UserInfo(username="XX",password="xxxx",phone="xxxxxxxx")

Original: https://blog.csdn.net/qq_44285092/article/details/121382080
Author: 而又何羡乎
Title: Django Auth 登录认证

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/734124/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球