2023.5.28
一,创建用户
在django中我们需要在templates的form中加入{%csrf_token%}这串内容,它的作用是当我们get表单页面时,服务器返回页面的同时也会向前端返回一串随机字符,post提交时服务器会验证这串字符来确保用户是在服务端返回的表单页面中提交的数据,防止有人通过例如jquery脚本向某个url不断提交数据,是一种数据提交的验证机制
request.POST是用来接受从前端表单中传过来的数据,比如用户登录过程中传递过来的username、passwrod等字段。返回类型是字典;
在后台进行数据获取时,有两种方法(以username为例):request.POST[‘username’]与request.POST.get(‘username’),那么这两者有什么不同之处呢?
如果传递过来的数值不为空,那么这两种方法都没有错误,可以得到相同的结果。但是如果传递过来的数值为空,那么request.POST[‘username’]则会提示Keyerror错误,而request.POST.get(‘username’)则不会报错,而是返回一个None
1.django的objects.get()方法:
django的get是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。
比如我数据库里有一条记录,记录的name的值是"django"的话,我用student = Student.objects.get(name=‘django’),
返回的是一个记录对象,你可以通过student.dict来查看,它返回的是一个字典的形式,{‘key’:valeus},key是字段的名称,而values是值的内容。
而如果我用get方法来查询一个数据库里不存在的记录,程序会报错。、
2.django的 objects.filter()方法:
django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。
比如我数据库里有一条记录,记录的name的值是Python的话,我用student = Student.objects.filter(name=‘python’)
它返回的student是一个对象的列表,可以看的出来student[0]和上面的get方式返回的student的结果是一样的。
最大区别:
get返回的是一个对象,并不是一个列表,相反filter得到的才是一个列表(一个对象列表)。因此当对象不存在时,get会报错,而filter则不会,返回一个空列表(没有对象)。
所以可以这样认为,get方法只能取到一个对象,而filter方法可以取到多个对象get方法取不到对象的话就会报错,而filter方法则相反,它是返回一个空列表
二,登录用户
user.is_active,用来判断用户名密码是否有效。
登录login(user,request):
将通过认证的用户的唯一标识信息(主键id),通过哈希加密写入到当前session会话中,退出登录:正好和登录相反(清理session会话信息)
三,重置密码
默认情况下,验证器在重置或修改密码的表单中使用,也可以在createsuperuser和 changepassword命令中使用。验证器不能应用在模型层,比如 User.objects.create_user() 和 create_superuser() ,因为我们假设开发者(非用户)会在模型层与 Django 进行交互,也因为模型验证不会在创建模型时自动运行
四,加密密码
make_password(password, salt=None, hasher='default')¶
通过此应用的格式创建一个哈希密码。它需要一个必需的参数:纯文本密码(字符串或字节)。或者,如果你不想使用默认配置( PASSWORD_HASHERS 配置的首个条目 ),那么可以提供 salt 和 使用的哈希算法。有关每个哈希的算法名,可查看 已包含的哈希。如果密码参数是 None ,将返回一个不可用的密码(永远不会被 check_password()通过的密码)。
五,退出登录
登出logout()方法:
1.Django用户认证系统提供了logout()方法
2.封装了清理session的操作,帮助我们快速实现登出一个用户
3.logout(request)位置:django.contrib.auth.init.py文件中
4.logout(request)接受一个request参数,从request获取cookie中的名为sessionid的值,通过哈希解密为用户的唯一标识信息(主键id),然后通过id查询数据库中是否有该用户,然后删除redis或者数据库表中的session会话信息,并且删除cookie中sessionid这一项(通过方法request.session.flush())