生成数据库html
查看 auth_user 数据库python
给 auth_user 表建立一个超级用户数据库
邮箱地址能够不写django
再看一下 auth_user 表后端
密码被加密了session
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>
该方法是用户认证功能,能够验证用户名和密码是否正确post
若是认证成功,会返回一个 User 对象;若是认证失败,会返回一个匿名对象ui
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
验证成功
该函数接受一个 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
验证成功
看一下执行结果:
获得的密码是加密后的
当调用该函数时,当前请求的 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
点击“注销”
跳转到登陆页面
该方法用来判断当前请求是否经过了认证
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
该方法能够给视图函数添加登陆校验
若是用户没有登陆,则会跳转到 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/
该方法用于建立一个新的用户
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 表
添加成功
该方法用于建立超级用户
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 表
成功建立超级用户
该方法检查密码是否正确的,须要提供当前请求用户的密码
密码正确返回 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
运行结果:
该方法用来修改密码
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 将设置的新密码保存