021 Django 内建用户系统

内建用户系统

简介

  • Django带有-一个用户认证系统。它处理用户账号、 组、权限以及基于cookie的用户会话。
  • 用户可以直接使用Django自带的用户表

基本字段

from django.contrib.auth.models import User
字段名字说明
username用户名
password密码
email邮箱
first_name
last_name
is_superuser是否是管理员帐号(/admin)
is_staff是否可以访问admin管理界面
is_active是否是活跃用户,默认True。一般不删除用户,
而是将用户的is_ active设为False。
last_login上一次的登录时间
date_joined用户创建的时间

扩展字段

有的时候我们觉得默认的配置字段不够用,我们也许还想要添加一个手机号字段,我们应该如何使用?

  1. 添加新的应用
  2. 定义模型类继承AbstractUser
  3. settings.py 中 指明AUTH_ USER_MODEL = ‘应用名.类名’

注意:此操作要在第一次 Migrate 之前进行

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

class UserInfo(AbstractUser):
    phone = models.CharField(Max_length=11,default='')

然后在 setting.py 中添加配置项

AUTH_USER_MODEL = 'user.UserInfo'

创建用户

  • 创建普通用户 create_user

    • from django.contrib.auth.models import User
      
      user = User.objects.create_user(username="用户名", password="密码", email="邮箱" ……)
      
  • 创建超级用户

    • from django.contrib.auth.models import User
      
      user = User.objects.create_superuser(username="用户名", password="密码", email="邮箱")
      
  • 我们这么多字段,其中只有账号和密码是必填的,其他都是选填,我们使用他的方法创建账号后,密码会自动帮我们变成哈希然后存储到数据库中

删除用户

from django.contrib.auth.models import User

try:
    user = User.objects.get(username="用户名")
    user.is_active = False # 修改我们当前用户的活跃值为 否
    user.save()
    print("删除用户成功!")
except:
    print("删除普通用户失败")

修改密码

from django.contrib.auth.models import User
from django.http import HttpResponse

try:
    user = User.objects.get(username="小小鸟")
    user.set_password("54321")
    user.save()
    return HttpResponse("修改密码成功")
except:
    return HttpResponse("修改密码失败")

校验密码

from django.contrib.auth import authenticate

user = authenticate(username=username, password=password)
  • 我们让 django 的方法来帮我们检测用户名和密码,如果成功就返回对应的 user 对象,如果失败就返回 None

保持登陆状态

from django.contrib.auth import login

def login_view(request):
    user = authenticate(username=username, password=password)
    # 调用 login 方法保持登陆状态
    login(request, user)
  • 只存 session 并且时间不可控

登陆状态校验(只有登陆才能查看的页面)

from django.contrib.auth.decorators import login_required

@login_required
def index_view(request):
    # 当前视图必须为用户登陆状态下才可以访问
    # 当前登陆用户可以通过 request.user 获取
    login_user = request.user
    print('当前登陆的用户是', login_user)

登陆状态取消(登出)

from django.contrib.auth import logout

def logout_view(request):
    logout(request)

指定默认登陆地址

  • 如果没有登陆就默认会跳转到这个页面进行登陆(需要在 settings.py 中设置)

  • LOGIN_URL = "地址"
    

image-20220628221059286

实战 使用内建用户系统再次做一个登陆

  1. 创建主页视图
from django.contrib.auth.decorators import login_required
from django.shortcuts import render

# Create your views here.

# 只有登陆才能看
@login_required
def index_view(request):
    
    return render(request, 'index/index.html')
  1. 给主页添加模板

image-20220628230956906

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>主页</title>
</head>
<body>
    <p>欢迎 {{request.user}} 用户</p>
    <a href={% url 'logout' %}>点击这里注销</a>
    <a href={% url "login" %}>返回登陆页面</a>
</body>
</html>
  1. 给主页添加路由
# urls.py 文件内

from django.urls import path
from . import views

urlpatterns = [
    path('',views.index_view, name='home'),
]
  1. 给用户 user 添加视图
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

# Create your views here.

def login_view(request):
    if request.method == 'GET':
        if str(request.user) != 'AnonymousUser':
            print("当前用户已登陆,自动跳转回首页",request.user)
            return HttpResponseRedirect(reverse('home'))
            #return HttpResponse("登陆")

        # 登陆页面
        return render(request, 'user/loginPage.html')
    
    if request.method == 'POST':
        # 判断我们的账户是否存在
        user = authenticate(username=request.POST.get('username'), password=request.POST.get('password'))
        if not user:
            return HttpResponse("账号或者密码错误")
        
        # 给我们的账号保持登陆状态
        login(request, user)
        
        return HttpResponseRedirect(reverse('home'))

def register_view(request):
    if request.method == 'GET':
        return render(request, 'user/register.html')
    
    if request.method == 'POST':
        # 判断密码是否相同
        if request.POST.get("password") != request.POST.get('password2'):
            return HttpResponse("两次输入的密码不一致!")
        
        # 判断我们的用户是否已经存在
        old_user = authenticate(username=request.POST.get('username'), password=request.POST.get('password')) 
        if old_user:
            return HttpResponse("当前用户名已经被注册了!")
        
        # 新建我们的用户
        user = User.objects.create_user(username=request.POST.get('username'), password=request.POST.get('password'))
        print("用户",user , "创建成功!")
        
        # 保持登陆状态
        login(request, user)
        
        # 前往主页
        return HttpResponseRedirect(reverse('home'))

def logout_view(request):
    logout(request)
    return HttpResponseRedirect(reverse('login'))
  1. 给 user 添加模板

    1. 注册的网页模板

      • <body>
            <form method="post" action={% url 'register' %}>
                {% csrf_token %}
                <p>用户名 <input type="text" name="username" value=""></p>
                <p>密码 <input type="password" name="password"></p>
                <p>重复密码 <input type="password" name="password2"></p>
                <input type="submit" name="提交">
            </form>
            <a href={% url "login" %}><button>返回登陆</button></a>
        </body>
        
    2. 登陆的网页模板

      • <body>
            <form method="post" action={% url 'login' %}>
                {% csrf_token %}
                <p>用户名 <input type="text" name="username" value=""></p>
                <p>密码 <input type="password" name="password"></p>
                <input type="submit" name="提交">
            </form>
            <a href={% url 'register' %}>
                <button>前往注册</button>
            </a>
        </body>
        
  2. 给 user 添加路由

# urls.py 文件内

from django.urls import path
from . import views

urlpatterns = [
    path('login',views.login_view, name='login'),
    path('logout',views.logout_view, name='logout'),
    path('register',views.register_view, name='register'),
]
  1. 前往网页端查看效果

fc34a543-82c4-4421-b129-b74e6f7ad047

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值