【Django】Django内建用户系统

Django内建用户系统

14.1 Django中的用户认证

14.2 用户系统表的基本字段

模型类位置 from django.contrib.auth.models import User

字段名 含义
username 用户名
password 密码
email 邮箱
first_name
last_name
is_superuser 是否管理员账号
is_staff 是否可以访问admin管理界面
is_active 是否是活跃用户,默认为True,一般不删除用户,而是将用户的is_active设为False
last_login 上一次登录时间
date_joined 用户创建的时间

14.3 用户系统的基本模型操作

  1. 创建普通用户 create_user:

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='用户名', password='密码', email='邮箱', ...)

  2. 创建超级用户 create_superuser:

    from django.contrib.auth.models import User
    user = User.objects.create_superuser(username='用户名', password='密码', email='邮箱', ...)

  3. 删除用户:

    from django.contrib.auth.models import User
    try:
        user = User.objects.get(username='用户名')
        user.is_active = False
        user.save()
        print("删除普通用户成功")
    except:
        print("删除普通用户失败")

  4. 校验密码:

    # 说明:如果用户名密码校验成功则返回对应的User对象,否则返回None
    from django.contrib.auth import authenticate
    user = authenticate(username=username, password=password)

  5. 修改密码:

    from django.contrib.auth.models import User
    try:
        user = User.objects.get(username='用户名')
        user.set_password('123456')
        user.save()
        print("修改密码成功")
    except:
        print("修改密码失败")

  6. 登录状态保持:

    from django.contrib.auth import login,authenticate
    def login_view(request):
        user = authenticate(username='用户名', password='密码')
        login(request, user)

  7. 登录状态校验:

    from django.contrib.auth.decorators import login_required
    @login_required
    def index_view(request):
        # 该视图必须为用户登录状态下才可以访问
        # 当前登录用户可以通过request.user获取
        login_user = request.user
        ...

  8. 用户注销登录:

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

代码示例:

  1. 创建 templates 目录,放置 html 页面。

  2. 编写对应的template页面。

    register.html,用户注册页。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Register</title>
    </head>
    <body>
        <form method="post" action="{% url 'register_page' %}">
            {% csrf_token %}
            {
        { form }}
            <input type="submit" value="Submit">
        </form>
    </body>
    </html>

    login.html,用户登录页。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Login</title>
    </head>
    <body>
        <form method="post" action="{% url 'login' %}">
            {% csrf_token %}
            {
        { form }}
            <input type="submit" value="Submit">
        </form>
    </body>
    </html>

    homepage.html,首页。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>homepage</title>
    </head>
    <body>
        <form method="post" action="{% url 'logout' %}">
            {% csrf_token %}
            欢迎访问项目
            <input type="submit" value="注销用户">
        </form>
    </body>
    </html>

  3. 编写对应的视图函数。

    from django.shortcuts import render
    from django.contrib.auth.models import User
    from django.http import HttpResponseRedirect, HttpResponse
    from django.contrib.auth import authenticate, login, logout
    from .forms import loginForm, registerForm
    from django.contrib.auth.decorators import login_required
    ​
    # Create your views here.
    def login_page(request):
        """
        项目登录面
        :param request:
        :return:
        """
        # return render(request, 'hello.html')
        if request.method == 'POST':
            form = loginForm(request.POST)
            if form.is_valid():
                # 处理表单提交逻辑,可以访问 form.cleaned_data 获取表单字段的值
                username = form.cleaned_data['username']
                password = form.cleaned_data['password']
                if not username or not password:
                    return HttpResponse("请输入正确的参数")
                # 校验密码
                user = authenticate(username=username, password=password)
                print('校验用户')
                print(user)
                if not user:
                    return HttpResponse("用户名或密码错误")
                else:
                    # 记录会话状态
                    login(request, user)
                    return HttpResponseRedirect('/homepage')
        else:
            form = loginForm()
    ​
        return render(request, 'login.html', {'form': form})
    ​
    ​
    def register_page(request):
        """
        项目注册页面
        :param request:
        :return:
        """
        # return render(request, 'hello.html')
        if request.method == 'POST':
            form = registerForm(request.POST)
            if form.is_valid():
                # 处理表单提交逻辑,可以访问 form.cleaned_data 获取表单字段的值
                username = form.cleaned_data['username']
                password1 = form.cleaned_data['password1']
                password2 = form.cleaned_data['password2']
                if not username or not password1 or not password2:
                    return HttpResponse("请传入正确的参数")
                # 进行注册操作
                try:
                    if password1 != password2:
                        return HttpResponse("两次输入的密码不一致")
                    # 创建用户
                    user = User.objects.create_user(username=username, password=password1)
                    # 注册成功
                    return HttpResponseRedirect('/login')
                except Exception as e:
                    # 注册失败
                    print(e)
                    return HttpResponse("注册用户失败,请联系管理员进行处理")
        else:
            form = registerForm()
    ​
        return render(request, 'register.html', {'form': form})
    ​
    def logout_func(request):
        """
        注销登录
        :param request:
        :return:
        """
        logout(request)
        return HttpResponseRedirect('/login')

  4. 编写对应的路由函数。

    from django.urls import path, re_path
    from . import views
    urlpatterns = [
        path("", views.login_page, name='login'),
        path("register/", views.register_page, name='register_page'),
        path("logout/", views.logout_func, name='logout')
    ]

  5. 配置项目默认的登录页面。

    # settings.py
    # 配置了登录地址,当访问到需要登录的页面时,如果此时用户未登录,则跳转至登录页面
    LOGIN_URL = '/login'

  6. 页面调用测试。

    注册页面输入用户名,密码,确认密码后点击submit进行登录。

    成功注册后,跳转至login页面,输入刚才注册的用户名和密码,点击submit进行登录。

    登录成功,跳转至项目首页。

    再打开一个标签页,注销登录后,项目首页无法访问。

14.4 用户系统的扩展字段

  • 通过建立新表,跟内建表做一对一映射。

  • 继承内建的抽象User模型类。

14.4.1 继承内部抽象类

步骤:

  1. 添加新的应用。

  2. 定义模型类,集成AbstractUser。

  3. settings.py中指明AUTH_USER_MODEL='应用名.类名'。

注:该操作需要在第一次migrate之前进行,否则会报如下的错误。

代码测试:

  1. 添加新的应用。

    python3 manage.py startapp useradmin

  2. 定义模型类,集成AbstractUser。

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    ​
    class UserInfo(AbstractUser):
    ​
        phone = models.CharField(max_length=11, default='')

  3. settings.py中指明AUTH_USER_MODEL='应用名.类名'。

    AUTH_USER_MODEL = 'useradmin.UserInfo'

  4. 执行代码迁移。

    python3 manage.py makemigrations
    python3 manage.py migrate
  5. 迁移成功后,查看数据库,auth_user表消失,出现了一个useradmin_userinfo的表。

  6. 创建新用户测试。

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='euansu', password='euansu', email='euansu@euansu.cn', phone=13000000000)

    查看数据库

    使用新创建的用户登录刚才的项目,可以正常登录。

最近更新

  1. TCP协议是安全的吗?

    2024-02-11 07:18:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-11 07:18:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-11 07:18:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-11 07:18:02       20 阅读

热门阅读

  1. 2 超级数据查看器APP 导入功能详解

    2024-02-11 07:18:02       27 阅读
  2. Spring中常见的设计模式

    2024-02-11 07:18:02       27 阅读
  3. Python编写远程控制工具--被控端的编写

    2024-02-11 07:18:02       22 阅读
  4. P1000 超级玛丽游戏(洛谷)

    2024-02-11 07:18:02       27 阅读
  5. re:从0开始的CSS学习之路 10. 盒子模型的溢出

    2024-02-11 07:18:02       24 阅读