Django-rest-framework: خطأ 'WSGIRequest' لا يحتوي كائن 'WSGIRequest' على سمة 'Success_authenticator'

تم إنشاؤها على ٦ يونيو ٢٠١٣  ·  4تعليقات  ·  مصدر: encode/django-rest-framework

عند تنفيذ طريقة مصادقة جديدة واستدعاء عرض بإذن IsAuthenticated ولم تتم مصادقة المستخدم ، يثير إطار عمل django rest:

  File "XXX/site-packages/rest_framework/views.py", line 206, in check_permissions
    self.permission_denied(request)
  File "XXX/site-packages/rest_framework/views.py", line 80, in permission_denied
    if not self.request.successful_authenticator:
  File "XXX/site-packages/rest_framework/request.py", line 362, in __getattr__
    return getattr(self._request, attr)
AttributeError: 'WSGIRequest' object has no attribute 'successful_authenticator'

تمت رؤية الكود ، أعتقد أنه غير صحيح. أين " self.request .successful_authenticator" أعتقد أنه يجب أن يكون " request .successful_authenticator".

Views.py بالقرب من الخط 80.

def permission_denied(self, request):
    """
    If request is not permitted, determine what kind of exception to raise.
    """
    if not self.request.successful_authenticator:
        raise exceptions.NotAuthenticated()
    raise exceptions.PermissionDenied()

التعليق الأكثر فائدة

لأي شخص آخر يصل إلى هذه المشكلة عبر Google ...

الدليل على مصدر الخطأ هو أنه يقول إن WSGIRequest لا يحتوي على خاصية successful_authenticator . ولكن في هذه المرحلة من كود DRF ، يجب أن نتعامل مع rest_framework.request.Request بدلاً من WSGIRequest .

وفي الواقع ، إذا قمت بإدخال الرمز عبر pdb ، فربما تجد أن لديك طلب DRF بدلاً من طلب WSGIR.

المشكلة هي أن request.Request يحتوي على عدد من @property أساليب مزخرفة (مثل user و successful_authenticator وغيرها) ولكن لديه أيضًا __getattr__ طريقة

ما يحدث هو: إذا أدى الكود في أي من الخصائص إلى تشغيل AttributeError فإن Python ستستدعي الطريقة __getattr__ بدلاً من ذلك ، والتي تحاول في النهاية العثور على سمة (بنفس اسم الخاصية التي خطأ) على الكائن الفرعي WSGIRequest .

هذه هي الطريقة التي تحصل بها على أخطاء مثل 'WSGIRequest' object has no attribute 'successful_authenticator' أو 'WSGIRequest' object has no attribute 'user' (هذا الأخير فقط إذا كنت لا تستخدم Django AuthenticationMiddleware بالطبع).

في حالتي ، جاء خطأ AttributeError من أحد authentication_classes ... والذي يتم استدعاؤه بدوره في المرة الأولى التي تصل فيها إلى خاصية @successful_authenticator . مجموعة الخصائص و __getattr__ في فئة الطلب تخفي بشكل فعال المصدر الحقيقي للخطأ.

ال 4 كومينتر

آسف ، لقد ارتكبت نفس الأخطاء في الكود الخاص بي !!!

لأي شخص آخر يصل إلى هذه المشكلة عبر Google ...

الدليل على مصدر الخطأ هو أنه يقول إن WSGIRequest لا يحتوي على خاصية successful_authenticator . ولكن في هذه المرحلة من كود DRF ، يجب أن نتعامل مع rest_framework.request.Request بدلاً من WSGIRequest .

وفي الواقع ، إذا قمت بإدخال الرمز عبر pdb ، فربما تجد أن لديك طلب DRF بدلاً من طلب WSGIR.

المشكلة هي أن request.Request يحتوي على عدد من @property أساليب مزخرفة (مثل user و successful_authenticator وغيرها) ولكن لديه أيضًا __getattr__ طريقة

ما يحدث هو: إذا أدى الكود في أي من الخصائص إلى تشغيل AttributeError فإن Python ستستدعي الطريقة __getattr__ بدلاً من ذلك ، والتي تحاول في النهاية العثور على سمة (بنفس اسم الخاصية التي خطأ) على الكائن الفرعي WSGIRequest .

هذه هي الطريقة التي تحصل بها على أخطاء مثل 'WSGIRequest' object has no attribute 'successful_authenticator' أو 'WSGIRequest' object has no attribute 'user' (هذا الأخير فقط إذا كنت لا تستخدم Django AuthenticationMiddleware بالطبع).

في حالتي ، جاء خطأ AttributeError من أحد authentication_classes ... والذي يتم استدعاؤه بدوره في المرة الأولى التي تصل فيها إلى خاصية @successful_authenticator . مجموعة الخصائص و __getattr__ في فئة الطلب تخفي بشكل فعال المصدر الحقيقي للخطأ.

واجهها عندما كان عرض DRF الخاص بنا يحتوي على authentication_classes غير لائق (بالصدفة ، فئات المصادقة القديمة لإطار عمل آخر لواجهة برمجة التطبيقات). أتمنى أن تصبح الثعبان يومًا ما آمنًا :)

لمعلوماتك ، إذا كنت تستخدم DRF مع djangorestframework-expiring-authtoken < 0.1.4 فسترى هذا الخطأ الناجم عن المشكلة التالية:
https://github.com/JamesRitchie/django-rest-framework-expiring-tokens/issues/11

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات