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_response111のファイル"/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" in reserved 11. if not request.user.is_authenticated():File "/Library/Frameworks/Python.framework/Versions/2.7/内部184のlib/python2.7 / site-packages / django / utils /functional.py」。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()ファイル" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/ contrib / auth/middleware。py "in 16. request.user = SimpleLazyObject(lambda:get_user(request))File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/auth/middleware get_user8の.py"。request._cached_user=auth.get_user(request)ファイル" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/auth/get_user101のinit.py"。user=backend.get_user(user_id)またはAnonymousUser()ファイル" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/django/auth .py "in get_user 149. return User.objects.with_id(user_id)File" /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()ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" in first 843. result =self[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._cursor_obj = self._collection.find(self._query、File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" in_query375。 self._mongo_query = self._query_obj.to_query(self._document)to_query202のファイル"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" = query.accept(QueryCompilerVisitor(document))ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" inaccept267。return visitor.visit_query(self)ファイル "/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)_transform_query720のファイル"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py"。value=field.prepare_query_value(op、 value)prepare_query_value455のファイル"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py"。returnself.to_mongo(value)ファイル "/ Library / Frameworks /Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py "in to_mongo 451. self.error(unicode(e))File"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py "in error 203. raise 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ましたが、それも失敗しました。

4

3 に答える 3

2

mongoengine最新バージョンに更新してみてください。マスターでは、

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()

トラックバックによると、useridw/の値が問題を引き起こします。None

于 2012-05-30T05:30:57.837 に答える
1

どのバージョンのMongoEngine/Djangoを使用していますか?

有効にしましたdjango.contrib.auth.middleware.AuthenticationMiddlewareか?UserインスタンスまたはAnonymousUserリクエストを設定する必要があります。

どのようにrs.claimutil.auth_backend.ClaimAuthBackend見えますか?そして、そのget_userメソッドは何を返しますか?認証バックエンドが1つしかない場合、エラーは発生しなくなりますか?

于 2012-05-30T08:27:12.150 に答える
1

私の見解の1つでは、次 r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend'のことがわかりました。これが、Djangoがsettings.pyのAUTHENTICATION_BACKENDSを無視し、カスタム認証バックエンドを使用していなかった理由です。

于 2012-05-30T15:30:48.083 に答える