django - Django Mongoengine 身份验证
问题描述
我已经设法将 django 2.0 与 mongoengine 连接起来。除了身份验证部分之外,其他一切都运行良好。在我的 settings.py 中,我有以下内容:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
#For Mongo Authentication
'mongoengine.django.mongo_auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
]
AUTH_USER_MODEL = 'mongo_auth.MongoUser'
MONGOENGINE_USER_DOCUMENT = 'mongoengine.django.auth.User'
并收到以下错误
core/checks/registry.py", line 73, in run_checks
new_errors = check(app_configs=app_configs)
File "/home/user/virtualenvs/project/lib/python3.5/site-packages/django/contrib/auth/checks.py", line 74, in check_user_model
if isinstance(cls().is_anonymous, MethodType):
AttributeError: 'MongoUser' object has no attribute 'is_anonymous'
从上面的错误中,我看到问题出在 AUTH_MODEL_USER 的声明中。我没有创建任何自定义用户模型,因为我希望能够使用 django.uath 用户模型....我需要了解如何设置它并能够创建用户并让他们登录。我该怎么办??
解决方案
我了解使用 Django 作为 ORM 和已经为您预先构建的身份验证的吸引力。我以前使用过 Django,但从未使用过 Mongoengine。我了解 Mongoengine 对 Django 的支持尚未完成。我最近使用 Mongoengine 在 Flask 中完成了一个项目,我建议您制作自己的用户模型。下面是我使用 bcrypt 自动预保存密码加密的示例。您可能需要安装 blinker 库以获得信号支持。
from mongoengine import Document, StringField
from mongoengine import signals // blinker library may need to be installed
from bcrypt import hashpw, gensalt
class User(Document):
first_name = StringField(required=True, max_length=50)
last_name = StringField(required=True, max_length=50)
username = StringField(unique=True, required=True, max_length=50)
password = StringField(required=True, min_length=6)
def to_json(self):
return {
"_id": str(self.pk),
"first_name": self.first_name,
"last_name": self.last_name,
"username": self.username,
"password": self.password
}
@classmethod
def pre_save(cls, sender, document, **kwargs):
hashed = hashpw(document.password.encode('utf8'), gensalt())
document.password = hashed.decode('utf8')
signals.pre_save.connect(User.pre_save, sender=User)
我知道你可能会失去 Django 的好处之一,但是在我看来,对用户模型进行这种级别的控制会让事情变得更容易,而不是学习 Django 的做事方式。to_json() 方法当然是可选的,它只是覆盖了 Mongoengine 的 to_json() 并使其更易于阅读。
要验证密码:
bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8'))
推荐阅读
- reactjs - react Portal - 在模态外部单击时如何关闭模态以及如何将 ref 分配给父组件渲染模态内的模态?
- microservices - 微服务 - 系统设计 - Node.js+React 框架 + Azure 上的 Mongo DB
- android - 图像不是类型 imageprovider 动态的子类型
- go - 如何从 Telnet 会话中读取数据
- c# - 用剃须刀页面填充html表格中的特定单元格
- ubuntu - Ubuntu 上的 AWS + Remmina - Remmina 进入循环尝试重新连接
- javascript - 如何在 ReactJS 中预先检查一些复选框
- javascript - 表单在提交发布请求时被清除
- python - Python将纯文本显示为html
- julia - Julia MethodError: 没有方法匹配 (::Dense{typeof(logistic),CuArray{Float32,2,Nothing},CuArray{Float32,1,Nothing}})(::Float32)