首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Mongoengine认证

Django Mongoengine认证
EN

Stack Overflow用户
提问于 2018-06-22 16:07:29
回答 1查看 485关注 0票数 0

我已经成功地将django 2.0与mongoengine连接起来。除了身份验证部分之外,其他所有事情都运行得很好。在我的settings.py中,我有以下内容:

代码语言:javascript
复制
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'

我得到了以下错误

代码语言:javascript
复制
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用户模型…我需要关于我可以如何设置它,并能够创建用户并让他们登录的想法。我该怎么走??

EN

回答 1

Stack Overflow用户

发布于 2018-06-26 03:47:53

我理解使用Django作为ORM和已经为您预先构建的身份验证的吸引力。我以前用过Django,但从来没有用过Mongoengine。我知道Mongoengine对Django的支持还没有完全完成。我最近用Mongoengine在Flask中完成了一个项目,我建议你制作自己的用户模型。下面是我如何使用bcrypt自动加密预保存密码的示例。您可能需要安装blinker库来支持信号。

代码语言:javascript
复制
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(),使其更具可读性。

要验证密码,请执行以下操作:

代码语言:javascript
复制
bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8'))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50983464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档