عند تنفيذ طريقة مصادقة جديدة واستدعاء عرض بإذن 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__
في فئة الطلب تخفي بشكل فعال المصدر الحقيقي للخطأ.
واجهها عندما كان عرض DRF الخاص بنا يحتوي على authentication_classes
غير لائق (بالصدفة ، فئات المصادقة القديمة لإطار عمل آخر لواجهة برمجة التطبيقات). أتمنى أن تصبح الثعبان يومًا ما آمنًا :)
لمعلوماتك ، إذا كنت تستخدم DRF مع djangorestframework-expiring-authtoken
< 0.1.4
فسترى هذا الخطأ الناجم عن المشكلة التالية:
https://github.com/JamesRitchie/django-rest-framework-expiring-tokens/issues/11
التعليق الأكثر فائدة
لأي شخص آخر يصل إلى هذه المشكلة عبر 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__
في فئة الطلب تخفي بشكل فعال المصدر الحقيقي للخطأ.