2012-05-30 50 views
1

當我嘗試做request.user.is_authenticated()我得到一個ValidationError: None is not a valid ObjectId使用request.user.is_authenticated()在Django項目

我試圖追查問題,但我不使用什麼MongoEngine是造成it.I'm (和MongoDB)

我有我的settings.py如下:

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


SESSION_ENGINE = 'mongoengine.django.sessions' 

這是我得到什麼:

回溯:文件 「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py」 in get_response 111. response = callback(request * callback_args,** callback_kwargs)儲備 11文件 「/Users/bastiano/Documents/ttsf/rsrv/views.py」 如果不是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 0.7 /站點包/賈NGO /了contrib/AUTH/middleware.py 「在 16. request.user = SimpleLazyObject(拉姆達:GET_USER(請求)) 文件 」 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/站點包/ django的/了contrib/AUTH/middleware.py 「 在GET_USER 8. request._cached_user = auth.get_user(請求)文件」 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 /站點包/ django的/了contrib/AUTH/初始化 py 「爲 在GET_USER 101用戶= backend.get_user(USER_ID)或AnonymousUser()文件 」 /Library/Frameworks/Python.framework/Versions/2.7 /lib/python2.7/site-packages/mongoengine/django/auth.py」 在GET_USER 149回User.objec ts.with_id(USER_ID)文件 「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py」 在with_id 923返回self.filter(PK =的object_id)。首先()文件 「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py」 在第一 843.結果=自[0]文件「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py」 in getitem 1136. return 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._cur sor_obj = self._collection.find(self._query,文件 「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py」 in _query 375。 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_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「 in visit_query 159. return QuerySet._transform_query(self.document,** query.query)File」/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/ 「在_transform_query 720值= field.prepare_query_value(OP,值)文件 」 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base queryset.py。 py「 in prepare_query_value 455. return self.to_mongo(value)File」/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py「 in to_mongo 451. self.error(unicode(e))文件「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py」 在錯誤 203加註ValidationError(消息,錯誤=錯誤,FIELD_NAME = FIELD_NAME)

異常類型:ValidationError在/ RS /權利要求異常值:無是 不是一個有效的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,但它也失敗了。

+0

請發表您的views.py。 –

+0

問題是Django使用'mongoengine.django.auth.MongoEngineBackend'而不是我創建的認證後端。儘管我在settings.py中指定了它,但我在其中一個視圖中有以下行:'r_v.obj.backend ='mongoengine.django.auth.MongoEngineBackend',這當然會強制Django使用該認證後端。 @Ross和@okm,謝謝! – Bastiano9

回答

0

在我的觀點一個我有以下幾點: r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend',這就是爲什麼Django的是settings.py忽略AUTHENTICATION_BACKENDS,也從來沒有使用我的自定義認證後端。

2

嘗試將您的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() 

Noneuserid瓦特/值引起該問題,根據該引用。

+0

我有最新的mongoengine。我在'get_user(userid)'和'get_user(self,userid)'上設置了一個跟蹤,並且它實際上使用了後者 - 這是'MongoEngineBackend'類的一部分。我以爲Django應該使用我定義的身份驗證後端。即使我在我的設置中註釋掉MongoEngineBackend,Django仍然使用MongoEngineBackend。 – Bastiano9

+0

@ Bastiano9已使用後端的信息存儲在會話中,因此註釋掉'MongoEngineBackend'對已保存的會話不起作用。其次,'get_user(userid)'中'userid'的價值是什麼? – okm

+0

我擺脫了存儲在數據庫中的所有會話並重新啓動服務器。我解決了這個問題。在我的一個觀點中,我有以下幾點:'r_v.obj.backend ='mongoengine.django.auth.MongoEngineBackend',這就是爲什麼它從未*使用我的自定義身份驗證後端。 – Bastiano9

1

你使用的是什麼版本的MongoEngine/Django?

你是否啓用了django.contrib.auth.middleware.AuthenticationMiddleware?這應該將User實例或AnonymousUser設置爲請求。

rs.claimutil.auth_backend.ClaimAuthBackend是什麼樣子的?它的get_user方法返回什麼?如果您只有一個身份驗證後端,它會停止錯誤嗎?

+0

你是否啓用了'django.contrib.auth.middleware.AuthenticationMiddleware'? - 是的。 我註釋了MongoEngine後端並設置了一個'import ipdb;在auth_backend.ClaimAuthBackend和Django中的'authenticate()'和'get_user()'上的ipdb.set_trace()'完全跳過了這個後端。 – Bastiano9

+0

so'ClaimAuthBackend'即使沒有安裝Mongoengine作爲後端也會被跳過? – Ross

+0

還有哪些版本? mongoengine/django – Ross

相關問題