先上想法,想对数据库账号的密码进行一个加密,但是django文档中的加密方法set_password貌似是只针对他们默认的user模型 或者继承 AbstractBaseUser的模型有效

from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import User

其中set_password 就是对make_password进行一层封装  直接在用户注册保存时 user.set_password = password 进行加密

验证密码也是对其封装 check_passwrod封装                   ................

如果自定义按照我下面的方法,但是没有request.user了


于是想在自己定义的模型中使用,查了查文档发现 那不就和 flask的werkzegu 中的两个加密方式一样

只是有一些小坑需要注意


from django.contrib.auth.hashers import make_password,check_password

class User(models.Model):
class Meta:
db_table = 'user' name = models.CharField(max_length=20,null=True,unique=True)
password = models.CharField(max_length=128)
create_date = models.DateTimeField(auto_now_add=True) def __str__(self):
return self.name def _set_password(self,password):
self.password = make_password(password) def _check_password(self,password):
return check_password(password,self.password)

简单的用户模型 其中_set_password 是我对需要进行保存的数据 进行一个密码加密 默认不做任何改动

_check_password 是对查询到的用户 进行一个验证,不过这就是这个坑点了,

在flask中验证密码是

def _check_password(self,password):
return check_password(self.password,passowrd)

先对查询到用户使用这个方法_check_password ,直接填入用户输入的明文密码对其验证就可以了

但是django 的参数位置和flask的相反,是先明文,在加密,容易以为是密码错误

# 源码
def check_password(password, encoded, setter=None, preferred='default'):

先明文密码,后加密密码 但我这个是类方法,其实和flask一样直接填写就好了,直接设置好了,不需要管参数位置

提醒在视图函数中使用这个加密方式 会出现这种问题    切记切记

 def login(request):
if request.POST.method == 'POST':
name = request.POST.get('name')
password = request.POST.get('password')
user = User.objects.filter(name=name).first()
if user:
if user._check_password(password)
# 舍弃掉 from django.contrib.auth import authenticate
# 换成自定义登录 authenticate毕竟只是对数据库查询该用户是否存在,但是如果加密,那么password字段查询还需要加密.. 算了
# 但是还用用 login对其用户session添加字段
login(request,user)
return redirect(revsrse('user:inde'))
else:
return render(request,'login.html',{"msg":"账号密码不匹配"})
else:
return render(request,'login.html',{"msg":"账号密码不匹配"}) return return render(request,'login.html')

引用 https://blog.csdn.net/qq_27437781/article/details/86002317

最新文章

  1. CMS本质上是什么
  2. 用VS开发PHP扩展
  3. BZOJ 4596: [Shoi2016]黑暗前的幻想乡
  4. HDU 5791 Two DP
  5. java文件上传路径缺少\的解决办法
  6. 电脑能上网,手机连上wifi不能上网
  7. Oracle11g安装出现em.ear
  8. 10 ways to be a faster code reviewer--reference
  9. SQL SERVER中如何格式化日期
  10. 14.4.2 Configuring InnoDB for Read-Only Operation 配置InnoDB 永于只读操作:
  11. Gradle依赖项学习总结,dependencies、transitive、force、exclude的使用与依赖冲突解决
  12. accp8.0转换教材第7章JavaScript操作DOM对象理解与练习
  13. 阿里巴巴开源前端框架--Weex实践
  14. 【一天一道LeetCode】#78. Subsets
  15. 【JavaScript】$.extend使用心得及源码研究
  16. selenium使用遇到的问题(selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.)
  17. 根Activity启动过程
  18. 使用win10的开始屏幕,在系统中设置简洁、快捷桌面
  19. 【python】re库 正则的一些过滤和把str拆分成list案例 以及json dict类型
  20. vue 获取时间戳对象转换为日期格式

热门文章

  1. [LC] 108. Convert Sorted Array to Binary Search Tree
  2. HashMap相关知识
  3. 年度Java技术盘点,懂这些技术的程序员2019发展大好
  4. [LC] 389. Find the Difference
  5. IT技术团队的管理幅度
  6. 吴裕雄--天生自然 R语言开发学习:时间序列(续二)
  7. nginx代理php项目的websocket
  8. Chrome 调试 react-native 通过Network面板查看网络请求
  9. AI能帮我们造出一个无肉的世界吗?
  10. module in JavaScript