python - 在表单和数据库之间比较密码总是无效的
问题描述
我试图用 Python/Django/MongoDB 创建一个登录系统。
这是我的代码
from django.shortcuts import render
from pymongo import MongoClient
import bcrypt
def login( req ):
response = { 'error': 'Error' }
if req.POST['username'] and req.POST['password']:
u = req.POST['username']
p = req.POST['password'].encode('utf8')
client = MongoClient()
result = client['db']['users'].find_one({'name': u})
if result:
hashed = bcrypt.hashpw( result['password'].encode('utf8'), bcrypt.gensalt() )
if bcrypt.checkpw( p, hashed ):
response = { 'error': 'Welcome!' }
else:
response = { 'error': 'Invalid password' }
else:
response = { 'error': 'Invalid username' }
else:
response = { 'error': 'Password/Username empty' }
return render( req, 'crawler/login.html', response )
我必须如何使用bcrypt.checkpw()
我这样存储密码$2b$12$tapbosJdMHGCnO6zb.n7Wu3acXyBh4Cj2jdJGv.1TmMBWYtd.nnWW
,测试真实密码是'password'
我必须如何存储密码?我必须如何比较密码?(从 DB 对 Form 传入值)
感谢您的指导
解决方案
您的方法非常复杂,您可以轻松地这样做:
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
推荐阅读
- android - 在最新的 AOSP 中,ADB 的最新版本是什么?
- python - 计算日期之前的值,迭代每一行
- python - 将西里尔文转换为拉丁文
- javascript - 复制到剪贴板 javascript 功能不起作用
- asp.net-core - 模型在 MVC 中究竟应该包含什么?
- rust - 移动后改变结构的字段
- swift - 为什么我的收藏视图单元格如此难以点击?
- c++ - 对象传输:通用引用或按值
- python - 在 Python3 ubuntu 上安装 tkinter
- nginx - Socket.io + Flask 和前端 HTTPS 反向代理 & 后端 HTTP 反向代理