当我尝试 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 回答
尝试将
mongoengine
更新为最新版本 . In master,它是根据引用,
userid
w /None
的值会导致问题 .您使用的是什么版本的MongoEngine / Django?
你启用了
django.contrib.auth.middleware.AuthenticationMiddleware
吗?这应该为请求设置User
实例或AnonymousUser
.rs.claimutil.auth_backend.ClaimAuthBackend
是什么样子的?它的get_user
方法返回了什么?它会停止吗?如果您只有一个身份验证后端,则会出错?在我的一个观点中,我有以下内容:
r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend'
,这就是为什么Django忽略了settings.py中的AUTHENTICATION_BACKENDS,并且从未使用过我的自定义身份验证后端 .