Django-filter: تحذير المستخدم: X غير متوافق مع إنشاء المخطط: بسبب AnonymousUser

تم إنشاؤها على ١٣ أغسطس ٢٠١٨  ·  4تعليقات  ·  مصدر: carltongibson/django-filter

أنا أنظر إلى UserWarnings الذي حاولت تحسينه في https://github.com/carltongibson/django-filter/pull/903 مرة أخرى:

…/django-filter/django_filters/rest_framework/backends.py:131: UserWarning: <class 'project.app.views.TermsOfServiceViewSet'> is not compatible with schema generation
  "{} is not compatible with schema generation".format(view.__class__)

يحدث ذلك غالبًا بسبب استخدام AnonymousUser ، وهو غير متوافق مع معظم طرق العرض get_queryset() ، والتي تفترض أن المستخدم قد تمت مصادقته (ولديه طرق معينة على وجه الخصوص).

أنا أستخدم drf_yasg هنا.

أتساءل عما إذا كانت هناك طريقة لتحسين هذا ، على سبيل المثال باستخدام مستخدم مصدق عليه (سيكون مشكلة drf-yasg ثم على الأرجح).

تتبع الأثر:

../../../Vcs/django-rest-framework/rest_framework/views.py:480: in dispatch
    response = handler(request, *args, **kwargs)
.venv/lib/python3.6/site-packages/drf_yasg/views.py:85: in get
    schema = generator.get_schema(request, self.public)
.venv/lib/python3.6/site-packages/drf_yasg/generators.py:215: in get_schema
    paths, prefix = self.get_paths(endpoints, components, request, public)
.venv/lib/python3.6/site-packages/drf_yasg/generators.py:337: in get_paths
    operation = self.get_operation(view, path, prefix, method, components, request)
.venv/lib/python3.6/site-packages/drf_yasg/generators.py:379: in get_operation
    operation = view_inspector.get_operation(operation_keys)
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/view.py:30: in get_operation
    query = self.get_query_parameters()
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/view.py:293: in get_query_parameters
    natural_parameters = self.get_filter_parameters() + self.get_pagination_parameters()
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/base.py:336: in get_filter_parameters
    fields += self.probe_inspectors(self.filter_inspectors, 'get_filter_parameters', filter_backend()) or []
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/base.py:71: in probe_inspectors
    result = method(obj, **kwargs)
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/query.py:27: in get_filter_parameters
    fields = filter_backend.get_schema_fields(self.view)
../../../Vcs/django-filter/django_filters/rest_framework/backends.py:131: in get_schema_fields
    "{} is not compatible with schema generation".format(view.__class__)
E   UserWarning: <class 'project.app.views.AffiliationViewSet'> is not compatible with schema generation

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

قد يكون أحد الحلول الممكنة هو تحديد شيء مثل هذا في طريقة get_queryset لمجموعة طرق العرض الخاصة بك. يبدو أن معالجة الحالة التي يكون فيها self.request هو None يؤدي الغرض.

def get_queryset(self):
    if self.request is None:
        return SomeModel.objects.none()

    return SomeModel.objects.filter(...)

ال 4 كومينتر

لا يمكننا فعل الكثير هنا . أي طريقة تحتاج إلى استدعاء get_queryset() ستنفذ في هذا. تحتاج أساسًا إلى السماح بذلك للتعامل مع الحالة المجهولة.

في كلتا الحالتين ، تتم معالجة المشكلة بشكل أفضل كجزء من منطق التأمل لدى DRF. (ولكن لا توجد إجابة بسيطة حتى الآن).

قد يكون أحد الحلول الممكنة هو تحديد شيء مثل هذا في طريقة get_queryset لمجموعة طرق العرض الخاصة بك. يبدو أن معالجة الحالة التي يكون فيها self.request هو None يؤدي الغرض.

def get_queryset(self):
    if self.request is None:
        return SomeModel.objects.none()

    return SomeModel.objects.filter(...)

شكرًا gunthercox ، لقد ساعدني تعليقك حقًا. لقد وضعني على طريق الحل ، لكن ما نجح معي في النهاية هو:

queryset = MyModel.objects.all()

def get_queryset(self):
    if not self.request:
        return MyModel.objects.none()

    if self.request.query_params:
        queryset = self.filter_queryset(self.queryset)
    else:
        queryset = self.queryset

    # ... the rest of the method code ...

    return queryset

أتمنى أن يساعد هذا شخصًا آخر في وضع مماثل.

أعتقد أن النهج المقترح هو هذا:

def get_queryset(self):
    if getattr(self, "swagger_fake_view", False):
        return MyModel.objects.none()

    # ... the rest of the method code ...

لقد رأيت ذلك في هذا الموضوع: https://github.com/axnsan12/drf-yasg/issues/333

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