【Django】Django内建用户系统

Django内建用户系统

14.1 Django中的用户认证

  • Django带有一个用户认证系统系统,它处理用户用户账号、组、权限以及基于cookie的用户会话。

  • 用户可以直接使用Django自带的用户表。

  • 官方文档:https://docs.djangoproject.com/zh-hans/2.2/topics/auth/

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)

    查看数据库

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/385742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言—基础数据类型(含进制转换)

进制转换不多&#xff0c;但我觉得适合小白(我爱夸自己嘿嘿) 练习 1. 确认基础类型所占用的内存空间(提示&#xff1a;使用sizeof 运算符)&#xff1a; 在这里我说一下&#xff0c;long 类型通常占用 4 字节。在 64 位系统上&#xff0c;long 类型通常也可为 8 字节。 格式…

部署JForum2过程。

居然用了两天时间&#xff0c;才把JForum2部署成功。走了一些弯路&#xff0c;主要原因是想当然&#xff0c;以为jdk和tomcat&#xff0c;应该向下兼容&#xff0c;所以就随便选的版本。 一、jdk-17、apache-tomcat-10.1.18-windows-x64&#xff0c;部署完jforum-2.8.2.war,改…

海量数据处理商用短链接生成器平台 - 4

第六章 架构核心技术-池化思想-异步结合 性能优化最佳实践 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误 项目就更新到第六章了&#xff0c;剩下的内容 放百度网盘里面了&#xff0c;需要的来取。 链接&#xff1a;https://pan.baidu.com/s/19LHPw36dsxPB7…

LeetCode、901. 股票价格跨度【中等,单调栈】

文章目录 前言LeetCode、901. 股票价格跨度【中等&#xff0c;单调栈】题目链接及分类思路思路1&#xff1a;暴力思路2&#xff1a;单调栈写法优化&#xff1a;单调栈简化写法(数组替代栈集合) 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、…

LeetCode、1143. 最长公共子序列【中等,二维DP】

文章目录 前言LeetCode、1143. 最长公共子序列【中等&#xff0c;二维DP】题目链接与分类思路2022年暑假学习思路及题解二维DP解决 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者…

如何才能学好JVM?——零基础入门篇

1. JVM是什么&#xff1f; JVM是Java Virtual Machine的简称&#xff0c;它是一个虚拟的计算机&#xff0c;专门为执行Java程序而设计。 你可以想象它是一个能够运行Java字节码的平台&#xff0c;无论你的程序在Windows、Mac还是Linux上&#xff0c;它们都能通过JVM在这些系统…

P1928 外星密码

网址如下&#xff1a; P1928 外星密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) C的string真的是太好用辣&#xff01; 思路就是用一个函数来递归翻译 代码如下&#xff1a; #include<iostream> #include<string> #include<cctype> using namespace…

springboot183基于java的公寓报修管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Microsoft OneNote 图片文字提取

Microsoft OneNote 图片文字提取 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本2. 插入图片​​​3. 复制图片中的文本References 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本 ​ 2. 插入图片 ​​​3. 复制图片…

Linux-进程信号

Linux进程信号 初步认识信号信号的存储结构信号的处理方式信号的产生硬件异常产生的信号核心转储sigset_t信号集信号集的操作函数对block表的操作对pending表的操作对handler表的操作信号的捕捉用户态和内核态 信号的处理过程可重入函数volatile关键字 初步认识信号 生活中有哪…

C# CAD2016 多边形顶点按方向重新排序

多边形顶点按方向重新排序 初始化多边形顶点集合 outerPoints 创建一个名为 outerPoints 的 List<Point2d>&#xff0c;用于存储多边形的所有顶点坐标。 计算多边形顶点集合的边界框&#xff08;BoundingBox&#xff09; 使用LINQ的Aggregate方法遍历整个outerPoints列表…

基于Zigbee的智能温室大棚系统(附详细使用教程+完整代码+原理图+完整课设报告)

🎊项目专栏:【Zigbee课程设计系列文章】(附详细使用教程+完整代码+原理图+完整课设报告) 前言 👑由于无线传感器网络(也即是Zigbee)作为🌐物联网工程的一门必修专业课,具有很强的实用性,因此很多院校都开设了zigbee的实训课程;👑同时最近很多使用了我的单片机课…

计算机网络——10FTP

FTP FTP&#xff1a;文件传输协议 向远程主机上传输文件或从远程主机接收文件客户/服务器模式 客户端&#xff1a;发起传输的一方服务器&#xff1a;远程主机 ftp:RFC 959ftp服务器&#xff1a;端口号为21 FTP&#xff1a;控制连接与数据连接分开 控制连接 FTP客户端与FTP服…

[FFmpeg学习]从视频中获取图片

从视频中获取图片是一个比较直观的例子&#xff0c;这里从一个基础的例子来查看FFmpeg相关api的使用&#xff0c;从mp4文件中获取一帧图像&#xff0c;保存为jpeg格式图片&#xff0c;mp4文件比较好准备&#xff0c;一般手机录屏文件就是mp4格式。 原理还是比较清楚&#xff0…

【杂谈】扣子(Coze) 初体验

扣子(Coze)是什么 官方原文如下&#xff1a; 扣子&#xff08;coze.cn&#xff09;是一款用来开发新一代 AI Chat Bot 的应用编辑平台&#xff0c;无论你是否有编程基础&#xff0c;都可以通过这个平台来快速创建各种类型的 Chat Bot&#xff0c;并将其发布到各类社交平台和通…

B2084 质因数分解

题目描述 已知正整数 n 是两个不同的质数的乘积&#xff0c;试求出较大的那个质数。 输入格式 输入只有一行&#xff0c;包含一个正整数 n&#xff08;6<n<&#xff09;。 输出格式 输出只有一行&#xff0c;包含一个正整数 p&#xff0c;即较大的那个质数。 输入输…

Java 基于 SpringBoot+Vue 的社区医院系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

《Java 简易速速上手小册》第8章:Java 性能优化(2024 最新版)

文章目录 8.1 性能评估工具 - 你的性能探测仪8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 VisualVM 监控应用性能8.1.3 拓展案例 1&#xff1a;使用 JProfiler 分析内存泄漏8.1.4 拓展案例 2&#xff1a;使用 Gatling 进行 Web 应用压力测试 8.2 JVM 调优 - 魔法引擎的调校8…

根据Ruoyi做二开

Ruoyi二开 前言菜单代码生成总结 前言 之前写过一篇文章&#xff0c;若依微服务版本搭建&#xff0c;超详细&#xff0c;就介绍了怎么搭建若依微服务版本&#xff0c;我们使用若依就是为了简化我们的开发&#xff0c;减少开发周期的&#xff0c;这篇文章就会介绍怎么使用若依进…

大型社区门口适合开什么店?商业趋势与消费需求分析

作为一名资深的鲜奶吧创业者&#xff0c;我在这个行业已经摸爬滚打了五年。期间&#xff0c;我见证了社区商业的蓬勃发展&#xff0c;也深刻体会到了选址对于店铺经营的重要性。 这篇文章&#xff0c;我和大家分享一下我的见解&#xff0c;探讨一下大型社区门口适合开什么店&a…