首页 文章

在Django项目中使用request.user.is_authenticated()

提问于
浏览
1

当我尝试 request.user.is_authenticated() 时,我得到一个 ValidationError: None is not a valid ObjectId

我试图追查问题,但我不知道是什么导致它 . 我正在使用MongoEngine(和MongoDB . )

我在settings.py中有以下内容:

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
    'rs.claimutil.auth_backend.ClaimAuthBackend',
)


SESSION_ENGINE = 'mongoengine.django.sessions'

这就是我得到的:

回溯:get_response 111中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py”.response = callback(request,* callback_args ,** callback_kwargs)文件“/Users/bastiano/Documents/ttsf/rsrv/views.py”保留11.如果不是request.user.is_authenticated():文件“/Library/Frameworks/Python.framework/Versions/2.7 /lib/python2.7/site-packages/django/utils/functional.py“在内部184. self._setup()文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site -packages / django / utils / functional.py“in _setup 248. self._wrapped = self._setupfunc()File”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django /contrib/auth/middleware.py“在16. request.user = SimpleLazyObject(lambda:get_user(request))File”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ get_user中的django / contrib / auth / middleware.py“8. request._cached_user = auth.get_user(request)File”/ Library /在get_user 101. user = backend.get_user(user_id)或AnonymousUser()文件中的框架/ Python.framework / Versions / 2.7 / lib / python2.7 / site-packages / django / contrib / auth / init.py“/ Library get_user中的/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/django/auth.py“ . 返回User.objects.with_id(user_id)文件”/ Library / Frameworks / Python .framework / Versions / 2.7 / lib / python2.7 / site-packages / mongoengine / queryset.py“in with_id 923. return self.filter(pk = object_id).first()File”/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py“in first 843. result = self [0] File”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2 . 7 / site-packages / mongoengine / queryset.py“在getitem 1136中 . 返回self._document._from_son(self._cursor [key])文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 _site-packages/mongoengine/queryset.py“in _cursor 579. self._cursor_obj = self._collection.find(self._query,File _query 375中的“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py”.self._mongo_query = self._query_obj.to_query(self._document)文件“ /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py“in to_query 202. query = query.accept(QueryCompilerVisitor(document))File”/ Library / Frameworks /Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py“in accept 267. return visitor.visit_query(self)File”/Library/Frameworks/Python.framework/Versions/2.7 /lib/python2.7/site-packages/mongoengine/queryset.py“在visit_query 159.中返回QuerySet._transform_query(self.document,** query.query)文件”/Library/Frameworks/Python.framework/Versions/2.7 /lib/python2.7/site-packages/mongoengine/queryset.py“in _transform_query 720.value = field.prepare_query_value(op,value)File”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2 . 7 / site-packages / mongoengine / base.py“在准备中re_query_value 455.返回self.to_mongo(value)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py”in_mongo 451.self.error(unicode) (e))错误203中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py” . 引发ValidationError(message,errors = errors,field_name = field_name)异常类型:/ rs / claim处的ValidationError异常值:None不是有效的ObjectId

任何想法为什么会这样?有没有更简单的方法在Django MongoDB中进行用户身份验证?

Views.py:

def claim(request):
    if request.method == 'GET':
        if not request.user.is_authenticated():
            return shortcuts.redirect('rs/login')
        all_b = dbutil.get_b(all=True)
        return shortcuts.render_to_response('rs/index.html',
                                             {'all_b':all_b},
                                            context_instance=template.RequestContext(request))
    elif request.method == 'POST':

为简单起见,省略了视图的其余部分 . 我使用ipdb来调试它, if not request.user.is_authenticated() 就是问题所在 . 我之前尝试使用 django.contrib.auth.decorators.login_required.decorator ,但它也失败了 .

3 回答

  • 0

    尝试将 mongoengine 更新为最新版本 . In master,它是

    def get_user(userid):
        """Returns a User object from an id (User.id). Django's equivalent takes
        request, but taking an id instead leaves it up to the developer to store
        the id in any way they want (session, signed cookie, etc.)
        """
        # your installed mongoengine might not include following two lines
        if not userid:
            return AnonymousUser()
        return MongoEngineBackend().get_user(userid) or AnonymousUser()
    

    根据引用, userid w / None 的值会导致问题 .

  • 1

    您使用的是什么版本的MongoEngine / Django?

    你启用了 django.contrib.auth.middleware.AuthenticationMiddleware 吗?这应该为请求设置 User 实例或 AnonymousUser .

    rs.claimutil.auth_backend.ClaimAuthBackend 是什么样子的?它的 get_user 方法返回了什么?它会停止吗?如果您只有一个身份验证后端,则会出错?

  • 2

    在我的一个观点中,我有以下内容: r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend' ,这就是为什么Django忽略了settings.py中的AUTHENTICATION_BACKENDS,并且从未使用过我的自定义身份验证后端 .

相关问题