Django之Auth模块
1.django 初识2.Django 连接数据库、迁移数据库、连接池3.Django 之 ORM表关系创建、请求生命周期4.一文搞懂 CGI, FastCGI, WSGI, uWSGI5.Django之url函数、有名无名分组、反向解析、url转换器6.序列化、CBV源码分析、模版层7.Django之models模型层18.Django之models模型层29.ORM 字段和参数10.简单图书管理系统11.Ajax技术+layer弹窗12.MTV和MVC、contentType、批量插入数据13.cookie和session14.Django之CBV装饰器、中间件、csrf 跨站请求伪造
15.Django之Auth模块
16.BBS项目一、
1、Auth模块是Django自带的用户认证模块:
开发一个网站无可避免的需要设计实现网站的用户系统。需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。
Django内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。
2、创建后台管理员
前提是迁移过数据库,有auth_user 表。注意python得版本
1 | / usr / bin / python3 manage.py createsuperuser |
二、
1、views
auth.authenticate 验证用户名和密码 和 auth.login 自动登录保存会话状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def login(request): if request.method = = 'POST' : # 接收前端传过来的数据 username = request.POST.get( 'username' ) password = request.POST.get( 'password' ) # 第二步验证用户名和面是否正确 # 1. 我们去哪个表中查询数据 2. 使用这张表中的哪个字段来比较 # 验证用户名和密码 user_obj = auth.authenticate(request, username = username, password = password) print (user_obj) # None print (user_obj) # root 管理员登录成功之后的用户对象 """ 注意事项:传递参数的时候,用户名和密码必须同时传入 """ #########################要么全部使用auth模块的方法,要么全部自己写,,一定别混合使用 if user_obj: # 验证成功,执行下面的代码 auth.login(request, user_obj) ### 只要写了auth.login,那么就可以在全局任何有request对象第地方通过request.user拿到用户的对象 return redirect( '/admin/' ) return render(request, 'login.html' ) |
auth.login() 会自动登录保存session状态
浏览器查看session
数据库查看session
2、login_required装饰器和 request.user.is_authenticated 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from django.contrib.auth.decorators import login_required # # http://127.0.0.1:8000/accounts/login/?next=/order/ # # @login_required # :http://127.0.0.1:8000/accounts/login/?next=/order/ # ''' # 当局部和全局(setting.py中)都存在的时候,按局部的 # 如果局部没有,按照全局的 # ''' @login_required (login_url = '/login/' ) # 没有登录的话跳转到指定的页面 def order(request): # 验证用户是否已经登录 print (request.user.is_authenticated) # True False # if request.user.is_authenticated: # # 处理登陆之后的逻辑 # pass # else: # pass # 没有登录,跳转登录页面 return HttpResponse( "order" ) |
使用装饰器login_required,如果没有登录,跳转到登录页面
删除session,访问order页面失败,说明auth.login自动处理了session。
三、
1、auth.logout(request) 会自动清除session
1 2 3 4 | def logout(request): # 清除cookie或者session auth.logout(request) return redirect( '/home/' ) |
四、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > < link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> < script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></ script > < script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></ script > </ head > < body > < form action="" method="post"> < div > username: < input type="text" name="username" readonly value="{{ request.user.username }}"> </ div > < div > old_password: < input type="password" name="old_password"> </ div > < div > new_password: < input type="password" name="new_password"> </ div > < div > re_password: < input type="password" name="re_password"> </ div > < input type="submit" value="提交"> </ form > </ body > </ html > |
request.user.set_password(new_password) 修改新密码
request.user.save() 保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @login_required def set_password(request): if request.method = = 'POST' : old_password = request.POST.get( 'old_password' ) new_password = request.POST.get( 'new_password' ) re_password = request.POST.get( 're_password' ) # 先验证两次密码是否输入一致 if new_password = = re_password: # 验证老密码是否正确 is_right = request.user.check_password(old_password) # is_right:True False if is_right: # 修改密码 request.user.set_password(new_password) request.user.save() return redirect( '/login/' ) return render(request, 'set_password.html' ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > < link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> < script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></ script > < script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></ script > </ head > < body > < form action="" method="post"> username: < input type="text" name="username"> password: < input type="text" name="password"> < input type="submit" value="提交"> </ form > </ body > </ html > |
1 2 3 4 5 6 7 8 9 10 11 12 13 | from django.contrib.auth.models import User def register(request): if request.method = = 'POST' : username = request.POST.get( 'username' ) password = request.POST.get( 'password' ) # 入库 # User.objects.create(username=username, password=password) # 普通用户 User.objects.create_superuser(username = username, password = password, email = '123@qq.com' ) # 管理员 # 自动入库到auth_user表 return redirect( '/login/' ) return render(request, 'register.html' ) |
在配置文件中加入下面一句话: AUTH_USER_MODEL = '应用名.类名', AUTH_USER_MODEL = 'app01.UserInfo'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # 默认情况下使用的就是auth_user的默认字段 # 扩展我们自己额外需要的字段 # 前提是:所有的模型类都继承 from django.contrib.auth.models import AbstractUser # 不要继承了models.Model 扩展之后需要在配置文件中加一句话 """""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做""""" # 如果你迁移了,还想扩展怎么办? 1. 换库 2. 需要删除很多个应用的migrations文件夹 python manage.py migrate myapp --fake """ 扩展表之后发生的变化: 1. 原来的auth_user表不存在了,换成你自己新建的表名了 2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段 3. 继承的类要发生改变AbstractUser 4. 在配置文件中加入下面一句话: AUTH_USER_MODEL = 'app01.UserInfo' AUTH_USER_MODEL = '应用名.类名' 5. 扩展之后还是按照原来的auth_user表使用 6. auth模块中的数据还是你扩展的表 7. 扩展之前别迁移. """ |