生成数据库
查看 auth_user 数据库
给 auth_user 表创建一个超级用户
邮箱地址可以不写
再看一下 auth_user 表
密码被加密了
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="/login/" method="post">
{% csrf_token %}
<p>
用户名:
<input type="text" name="username">
</p>
<p>
密码:
<input type="password" name="password">
</p>
<p>
<input type="submit" value="登录">
</p>
</form>
</body>
</html>
authenticate():
该方法是用户认证功能,可以验证用户名和密码是否正确
如果认证成功,会返回一个 User 对象;如果认证失败,会返回一个匿名对象
authenticate() 会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的
views.py:
from django.shortcuts import render, redirect
from django.contrib import auth
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 判断用户名密码是否有效
user = auth.authenticate(username=username, password=password)
if user:
# 如果用户名密码有效
return redirect("/index/")
return render(request, "login.html")
def index(request):
return render(request, "index.html")
访问,http://127.0.0.1:8000/login/
输入 admin,admin123
验证成功
login(HttpRequest, user):
该函数接受一个 HttpRequest 对象,以及一个经过认证的 User 对象
该函数实现一个用户登录的功能,它本质上会在后端为该用户生成相关 session 数据
views.py:
from django.shortcuts import render, redirect
from django.contrib import auth
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 判断用户名密码是否有效
user = auth.authenticate(username=username, password=password)
# 将登录的用户封装到 request.user
auth.login(request, user)
if user:
# 如果用户名密码有效
return redirect("/index/")
return render(request, "login.html")
def index(request):
print(request.user.username) # 获取到封装的 request.user 的 username
print(request.user.password) # 获取到封装的 request.user 的 password
return render(request, "index.html")
访问,http://127.0.0.1:8000/login/
输入 admin,admin123
验证成功
看一下执行结果:
得到的密码是加密后的
logout():
当调用该函数时,当前请求的 session 信息会全部被清除
如果没有登录信息,使用该函数也不会报错
views.py:
from django.shortcuts import render, redirect
from django.contrib import auth
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 判断用户名密码是否有效
user = auth.authenticate(username=username, password=password)
# 将登录的用户封装到 request.user
auth.login(request, user)
if user:
# 如果用户名密码有效
return redirect("/index/")
return render(request, "login.html")
def index(request):
print(request.user.username) # 获取到封装的 request.user 的 username
print(request.user.password) # 获取到封装的 request.user 的 password
return render(request, "index.html")
def logout(request):
auth.logout(request)
return redirect("/login/")
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index 页面</title>
</head>
<body>
<h1>这里是 index 页面</h1>
<a href="/logout/">注销</a>
</body>
</html>
访问,http://127.0.0.1:8000/login/
输入 admin,admin123
点击“注销”
跳转到登录页面
is_authenticated():
该方法用来判断当前请求是否通过了认证
views.py:
from django.shortcuts import render, redirect
from django.contrib import auth
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 判断用户名密码是否有效
user = auth.authenticate(username=username, password=password)
# 将登录的用户封装到 request.user
auth.login(request, user)
if user:
# 如果用户名密码有效
return redirect("/index/")
return render(request, "login.html")
def index(request):
print(request.user.username) # 获取到封装的 request.user 的 username
print(request.user.password) # 获取到封装的 request.user 的 password
ret = request.user.is_authenticated() # 判断是否通过了认证
print(ret)
return render(request, "index.html")
def logout(request):
auth.logout(request)
return redirect("/login/")
访问,http://127.0.0.1:8000/login/
输入 admin,admin123
login_requierd():
该方法可以给视图函数添加登录校验
如果用户没有登录,则会跳转到 django 默认的登录 URL “/accounts/login/”,并传递当前访问 url 的绝对路径(登陆成功后,会重定向到该路径)
views.py:
from django.shortcuts import render, redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 判断用户名密码是否有效
user = auth.authenticate(username=username, password=password)
# 将登录的用户封装到 request.user
auth.login(request, user)
if user:
# 如果用户名密码有效
return redirect("/index/")
return render(request, "login.html")
@login_required
def index(request):
return render(request, "index.html")
访问,http://127.0.0.1:8000/index/
因为不存在 /account/login/ 目录
如果需要自定义登录的 URL,可以在 settings.py 中通过 LOGIN_URL 进行修改
访问,http://127.0.0.1:8000/index/
create_user():
该方法用于创建一个新的用户
views.py:
from django.shortcuts import HttpResponse
from django.contrib.auth.models import User
def reg(request):
User.objects.create_user(username="test", password="test") # 创建新用户
return HttpResponse("注册成功!")
访问,http://127.0.0.1:8000/reg/
查看 auth_user 表
添加成功
create_superuser():
该方法用于创建超级用户
views.py:
from django.shortcuts import HttpResponse
from django.contrib.auth.models import User
def reg(request):
User.objects.create_superuser(username="root", password="root123", email="") # 创建新的超级用户
return HttpResponse("注册成功!")
访问,http://127.0.0.1:8000/reg/
查看 auth_user 表
成功创建超级用户
check_password(raw_password):
该方法检查密码是否正确的,需要提供当前请求用户的密码
密码正确返回 True,否则返回 False
views.py:
from django.shortcuts import render, redirect
from django.contrib import auth
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 判断用户名密码是否有效
user = auth.authenticate(username=username, password=password)
# 将登录的用户封装到 request.user
auth.login(request, user)
if user:
# 如果用户名密码有效
return redirect("/index/")
return render(request, "login.html")
def index(request):
ret = request.user.check_password(raw_password="aaa") # 检查密码是否是 aaa
print(ret)
return render(request, "index.html")
访问,http://127.0.0.1:8000/login/
输入 admin,admin123
运行结果:
set_password(raw_password):
该方法用来修改密码
views.py:
from django.shortcuts import HttpResponse
from django.contrib.auth.models import User
def reg(request):
user_obj = User.objects.create_user(username="test1", password="test") # 创建新用户
user_obj.set_password("root") # 设置新密码
user_obj.save() # 保存设置的新密码
return HttpResponse("注册成功!")
新创建的用户 test1 的密码为 root,而不是 test
这里需要用 save 将设置的新密码保存