内建用户系统
文章目录
简介
- Django带有-一个用户认证系统。它处理用户账号、 组、权限以及基于cookie的用户会话。
- 用户可以直接使用Django自带的用户表
基本字段
from django.contrib.auth.models import User
字段名字 | 说明 |
---|---|
username | 用户名 |
password | 密码 |
邮箱 | |
first_name | 名 |
last_name | 姓 |
is_superuser | 是否是管理员帐号(/admin) |
is_staff | 是否可以访问admin管理界面 |
is_active | 是否是活跃用户,默认True。一般不删除用户, 而是将用户的is_ active设为False。 |
last_login | 上一次的登录时间 |
date_joined | 用户创建的时间 |
扩展字段
有的时候我们觉得默认的配置字段不够用,我们也许还想要添加一个手机号字段,我们应该如何使用?
- 添加新的应用
- 定义模型类继承AbstractUser
- 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 = "地址"
实战 使用内建用户系统再次做一个登陆
- 创建主页视图
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')
- 给主页添加模板
<!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>
- 给主页添加路由
# urls.py 文件内
from django.urls import path
from . import views
urlpatterns = [
path('',views.index_view, name='home'),
]
- 给用户 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'))
-
给 user 添加模板
-
注册的网页模板
-
<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>
-
-
登陆的网页模板
-
<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>
-
-
-
给 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'),
]
- 前往网页端查看效果