Django Mongoengine身份验证
我已经成功地将django 2.0与mongoengine连接起来。除了身份验证部分,其他一切都正常工作。 在my settings.py中,我有以下内容:Django Mongoengine身份验证,django,mongoengine,Django,Mongoengine,我已经成功地将django 2.0与mongoengine连接起来。除了身份验证部分,其他一切都正常工作。 在my settings.py中,我有以下内容: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', #For Mongo Authentication 'mongoengine.django.mongo_auth', 'django.contrib.contenttyp
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_用户的声明上。我没有创建任何自定义用户模型,因为我希望能够使用django.uath用户模型……我需要了解如何设置它,以及如何创建用户并让他们登录。我该怎么办 我理解使用Django作为ORM和已经为您预先构建的身份验证的吸引力。我以前使用过Django,但从未使用过Mongoengine。我知道Mongoengine对Django的支持尚未完成。我最近与Mongoengine在Flask中完成了一个项目,我建议您制作自己的用户模型。下面是我使用bcrypt对密码进行自动加密预保存的示例。您可能需要安装闪烁器库以获得信号支持
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'))
谢谢你这么好的回复。然而,我选择使用djongo而不是mongoengine。