我已经成功地将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用户模型…我需要关于我可以如何设置它,并能够创建用户并让他们登录的想法。我该怎么走??
发布于 2018-06-26 03:47:53
我理解使用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'))https://stackoverflow.com/questions/50983464
复制相似问题