怎么用vps搭建网站,辽宁省营商环境建设监督局网站,南通网站开发,三亚做网站那家效果好Auth模块引入
我们在创建一个Django项目之后#xff0c;直接执行数据库迁移命令会自动生成很多表 django_sessionauth_userDjango在启动之后就可以直接访问admin路由#xff0c;需要输入用户名和密码#xff0c;数据参考的就是auth_user表,并且必须是管理员用户才能进入
【…Auth模块引入
我们在创建一个Django项目之后直接执行数据库迁移命令会自动生成很多表 django_sessionauth_userDjango在启动之后就可以直接访问admin路由需要输入用户名和密码数据参考的就是auth_user表,并且必须是管理员用户才能进入
【1】创建超级用户(管理员)
在终端输入一下指令
python36 manage.py createsuperuser
在终端中操作
E:\Python39\python.exe E:\Pycharm\PyCharm 2023.1.3\plugins\python\helpers\pycharm\django_manage.py createsuperuser E:/Old Boy/django_project/day14
Tracking file by folder pattern: migrations
Username (leave blank to use administrator): dream
Email address:
Warning: Password input may be echoed.
Password: 521
Warning: Password input may be echoed.
Password (again): 521
This password is too short. It must contain at least 8 characters.
Bypass password validation and create user anyway? [y/N]: This password is entirely numeric.y
Superuser created successfully.Process finished with exit code 0
【2】利用auth_user表完成登录注册功能
【2.0】基础登录
【2.0.1】配置路由
path(login/, views.login),
【2.0.2】前端代码
form action methodpost{# 取消crsf校验 #}{% csrf_token %}pusername:input typetext nameusername/pppassword:input typetext namepassword/pinput typesubmit classbtn btn-success
/form
【2.0.3】后端代码
from django.shortcuts import render
from django.contrib import auth# Create your views here.
def login(request):if request.method POST:# 1 取到前端输入的用户名和密码username request.POST.get(username)password request.POST.get(password)# 2 进行用户名和密码的校验# 从用户表中获取数据# --- 1、表如何获取# --- 2、表中的密码是密文如何比对# 导入 auth 校验模块 from django.contrib import authuser_obj auth.authenticate(request, usernameusername, passwordpassword)# [1] 用户名和密码正确的情况下print(user_obj) # dream ---- 这是用户对象内部封装的一个方法 __str__ 方法print(user_obj.username) # dreamprint(user_obj.password) # pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4# [2] 用户名和密码不正确的情况下print(user_obj) # None ---- 如果数据不符合则返回None【1】自动查找 auth_user 表【2】自动给密码加密进行比对注意事项参数必须传入用户名和密码不能只传入一个用户名(一步就帮助我们筛选出用户数据)return render(request, login.html)
【2.1】保存用户状态
如果使用auth模块就使用其中所有封装好的方法 如果不想使用就单独封装方法不要调用其中的方法 auth.login(request, user_obj) 类似于 request.session[key] user_obj只要执行了上面的方法就可以在任何地方通过 request.user获取当前用户的登录对象
from django.shortcuts import render
from django.contrib import auth# Create your views here.
def login(request):if request.method POST:# 1 取到前端输入的用户名和密码username request.POST.get(username)password request.POST.get(password)# 2 进行用户名和密码的校验# 从用户表中获取数据# --- 1、表如何获取# --- 2、表中的密码是密文如何比对# 导入 auth 校验模块 from django.contrib import authuser_obj auth.authenticate(request, usernameusername, passwordpassword)# 判断当前用户是否存在 --- 存在则有值不存在则返回Noneif user_obj:# 保存用户状态auth.login(request, user_obj) # 类似于 request.session[key] user_obj# 只要执行了上面的方法就可以在任何地方通过 request.user 获取当前用户的登录对象【1】自动查找 auth_user 表【2】自动给密码加密进行比对注意事项参数必须传入用户名和密码不能只传入一个用户名(一步就帮助我们筛选出用户数据)return render(request, login.html)
【2.2】登录后跳转
from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth# Create your views here.
def login(request):if request.method POST:# 1 取到前端输入的用户名和密码username request.POST.get(username)password request.POST.get(password)# 2 进行用户名和密码的校验# 从用户表中获取数据# --- 1、表如何获取# --- 2、表中的密码是密文如何比对# 导入 auth 校验模块 from django.contrib import authuser_obj auth.authenticate(request, usernameusername, passwordpassword)# 判断当前用户是否存在 --- 存在则有值不存在则返回Noneif user_obj:# 保存用户状态auth.login(request, user_obj) # 类似于 request.session[key] user_obj# 只要执行了上面的方法就可以在任何地方通过 request.user 获取当前用户的登录对象# 登陆成功后跳转页面return redirect(/home/)【1】自动查找 auth_user 表【2】自动给密码加密进行比对注意事项参数必须传入用户名和密码不能只传入一个用户名(一步就帮助我们筛选出用户数据)return render(request, login.html)def home(request):print(request.user) # dream ---- 这是用户对象内部封装的一个方法 __str__ 方法print(request.user)# 登陆成功 dream ---- 这是用户对象内部封装的一个方法 __str__ 方法# 未登录访问 AnonymousUser ---- 匿名用户# 本质上是自动去django_session里面查找到当前用户对象然后封装到 request.user 中return HttpResponse(OK)
判断用户是否登录
def home(request):print(request.user)# 登陆成功 dream ---- 这是用户对象内部封装的一个方法 __str__ 方法# 未登录访问 AnonymousUser ---- 匿名用户# 本质上是自动去django_session里面查找到当前用户对象然后封装到 request.user 中# 判断用户是否登陆print(request.user.is_authenticated()) # 匿名用户返回 Falsereturn HttpResponse(OK)
【2.2.1】登录后才能访问页面 -------- 局部配置
from django.contrib.auth.decorators import login_required# 添加装饰器 --- 指定未登录的跳转页面
login_required(login_url/login/) # 局部配置
def home(request):用户登录后才能访问的页面print(request.user)# 登陆成功 dream ---- 这是用户对象内部封装的一个方法 __str__ 方法# 未登录访问 AnonymousUser ---- 匿名用户# 本质上是自动去django_session里面查找到当前用户对象然后封装到 request.user 中# 判断用户是否登陆print(request.user.is_authenticated()) # 匿名用户返回 Falsereturn HttpResponse(OK)
【2.2.2】登录后才能访问页面 ----- 全局配置
在settings文件中添加
LOGIN_URL /login/
from django.contrib.auth.decorators import login_required# 添加装饰器 --- 指定未登录的跳转页面
login_required
def home(request):用户登录后才能访问的页面print(request.user)# 登陆成功 dream ---- 这是用户对象内部封装的一个方法 __str__ 方法# 未登录访问 AnonymousUser ---- 匿名用户# 本质上是自动去django_session里面查找到当前用户对象然后封装到 request.user 中# 判断用户是否登陆print(request.user.is_authenticated()) # 匿名用户返回 Falsereturn HttpResponse(OK)login_required
def index(request):return HttpResponse(index)
【2.3】小结
局部/全局优先级 局部大于全局各自的优点 全局的优点 无需书写重复的代码但是页面的跳转很单一局部的优点 在于不同的视图函数再用户没有登录的情况下可以跳转到不同的页面
【3】修改密码 【3.1】路由文件的配置
# 修改密码
path(set_password/, views.set_password), 【3.2】后端代码
login_required
def set_password(request):if request.method POST:old_password request.POST.get(old_password)new_password request.POST.get(new_password)confirm_password request.POST.get(confirm_password)# 先校验两次密是否一致if new_password confirm_password:# 校验旧密码是否相同is_right request.user.check_password(old_password) # 内部自己加密密码进行比对# 返回的结果为 True 或者 Falseif is_right:# 修改密码request.user.set_password(confirm_password) # 仅仅在修改对象的属性# 修改完密码后进行保存数据request.user.save()return redirect(/login/)return render(request, set_password.html, locals()) 【3.3】前端代码
form action methodpost{# 取消crsf校验 #}{% csrf_token %}pusername:input typetext nameusername disabled value{{ request.user.username }}/ppold_password:input typetext nameold_password/ppnew_password:input typetext namenew_password/ppconfirm_password:input typetext nameconfirm_password/pinput typesubmit classbtn btn-success
/form
【4】注销 【4.1】路由配置
# 注销用户
path(login_out/, views.login_out), 【4.2】后端代码
login_required
def login_out(request):auth.logout(request) # 清空当前登录用户的数据 ----- request.session.flush()return redirect(/login/)
【5】注册功能 【5.1】路由配置
# 注册用户
path(register/, views.register), 【5.2】后盾
def register(request):if request.method POST:username request.POST.get(username)password request.POST.get(password)confirm_password request.POST.get(confirm_password)# 操作auth_user表写入数据# User.objects.create(usernameusername, passwordconfirm_password) # 会写入数据但是保存的密码是明文的没有加密# 创建普通用户User.objects.create_user(usernameusername, passwordconfirm_password)# 创建超级用户 - 了解 --- 使用代码创建超级用户邮箱和密码是必填的而用命令创建可以忽略邮箱# User.objects.create_superuser(usernameusername, passwordpassword,emailemail)return render(request, register.html)
【6】总结 【6.1】校验密码是否正确
from django.contrib import auth
# 1 取到前端输入的用户名和密码
username request.POST.get(username)
password request.POST.get(password)
# 2 进行用户名和密码的校验 ---- 参数必须传用户名和密码
user_obj auth.authenticate(request, usernameusername, passwordpassword)# [1] 用户名和密码正确的情况下
print(user_obj)
# dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
print(user_obj.username)
# dream
print(user_obj.password)
# pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4# [2] 用户名和密码不正确的情况下
print(user_obj) # None ---- 如果数据不符合则返回None 【6.2】保存用户状态
# 判断当前用户是否存在 --- 存在则有值不存在则返回None
if user_obj:# 保存用户状态auth.login(request, user_obj) # 类似于 request.session[key] user_obj# 只要执行了上面的方法就可以在任何地方通过 request.user 获取当前用户的登录对象 【6.3】判断当前用户是否登录
# 判断用户是否登陆
# 匿名用户返回 False 正常用户返回 True
print(request.user.is_authenticated) 【6.4】获取当前登录的用户
print(request.user)
# 登陆成功 dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
# 未登录访问 AnonymousUser ---- 匿名用户
# 本质上是自动去django_session里面查找到当前用户对象然后封装到 request.user 中 【6.5】检验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
1、局部配置2、全局配置3、全局/局部的优缺点 【6.6】校验原密码
# 校验旧密码是否相同
is_right request.user.check_password(old_password) # 内部自己加密密码进行比对
# 返回的结果为 True 或者 False 【6.7】修改密码
# 修改密码
request.user.set_password(confirm_password) # 仅仅在修改对象的属性
# 修改完密码后进行保存数据
request.user.save() 【6.8】注销登录用户
auth.logout(request)
# 清空当前登录用户的数据 ----- request.session.flush() 【6.9】注册
# 操作auth_user表写入数据
# 会写入数据但是保存的密码是明文的没有加密
User.objects.create(usernameusername, passwordconfirm_password)
# 创建普通用户
User.objects.create_user(usernameusername, passwordconfirm_password)# 创建超级用户 - 了解 --- 使用代码创建超级用户邮箱和密码是必填的而用命令创建可以忽略邮箱
User.objects.create_superuser(usernameusername, passwordpassword,emailemail)
【7】扩展auth_user表 【7.1】方式一
from django.db import models
from django.contrib.auth.models import User, AbstractUser# Create your models here.
# 扩展 auth_user 表
# 第一种方式 一对一关系(不推荐)
class UserDetail(models.Model):phone models.CharField(max_length32)user models.OneToOneField(toUser, on_deletemodels.CASCADE) 【7.2】方式二
from django.db import models
from django.contrib.auth.models import User, AbstractUser# 第二种方式 面向对象的继承
class UserInfo(AbstractUser):如果继承了AbstractUser那么在执行数据库迁移命令的时候auth_user表就不会被创建而 UserInfo 会在 auth_user表 的基础上添加自定义扩展的字段优点直接通过自己定义的表快速完成操作及扩展前提1在执行之前没有执行过数据库迁移命令auth_user 表没有被创建如果当前库已经被创建则需要更换新的库2继承的表里面不要覆盖 AbstractUser 里面的字段名表里面有的字段不要动只扩展额外的字段即可3需要再配置文件中声明Django要使用 UserInfo 替代 auth_userAUTH_USER_MODEL app01.UserInfo ---应用名.表名phone models.CharField(max_length32)
需要再配置文件中声明Django要使用UserInfo代替auth_user AUTH_USER_MODEL app01.UserInfo ---应用名.表名
如果自己写表代替了auth_userauth模块功能正常使用参考的表也由auth_user变成了UserInfo