Django-filter: يُسمح بحقول التصفية من الناحية الفنية لجميع إجراءات عرض DRF. هذا عبث مع مخطط CoreAPI.

تم إنشاؤها على ١٦ مايو ٢٠١٨  ·  3تعليقات  ·  مصدر: carltongibson/django-filter

عند استخدام CoreAPI مع تمكين DRF و DjangoFilterBackend ، يحاول العميل تعيين كافة الحقول لإجراءات الإنشاء أو التحديث أو التحديث الجزئي إلى معلمات الاستعلام أيضًا. هذا يكسر قدرة العميل على استخدام هذه الأساليب.

مثال

إذا كان لدينا طلب يحاول إنشاء كتاب باسم ، والاسم هو أيضًا حقل قابل للتصفية في نموذجنا:

# book views
class BookViewSet():
    filter_fields = ('name',)
   # ...
// schema
client.action('book', 'create', { 'name': 'My Awesome Book' });

سيؤدي هذا إلى إنشاء طلب بالاسم في معلمة URL بالإضافة إلى نص الطلب. هذا ليس السلوك المتوقع.

POST /api/book?name=My%20Awesome%20Book

name=My Awesome Book

الحل المقترح

لقد أصلحنا هذا في الكود الخاص بنا عن طريق توجيه الخلفية الخلفية لمرشح DRF إلى تجاوز مخصص بالشفرة التالية:

class OnlyFilterOnReadDjangoFilterBackend(DjangoFilterBackend):
    """ A filter backend that only allows for filtering by properties on
    actions deemed as safe. This means that create, update, and partial_update
    actions will not provide filter options.
    """
    SAFE_ACTIONS = ('list', 'retrieve')

    def get_schema_fields(self, view):
        if view.action in self.SAFE_ACTIONS:
            return super().get_schema_fields(view)
        return []

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

مرحبًاSonictherocketman. شكرا على التقرير.

فكرتي الأولى هي أن هذا خطأ في واجهة برمجة تطبيقات العميل - فهو لا يميز بشكل مناسب بين معلمات سلسلة الاستعلام ونص الطلب عند إنشاء الطلب.

بشكل عام ، مجرد تعطيل التصفية للإجراءات غير الآمنة ليس صحيحًا. تحدث التصفية عند إنشاء مجموعة الاستعلام الأساسية التي سيتم إجراء تحديث عليها.

سأترك هذا مفتوحًا الآن ، فقط لأفكر فيه.

ال 3 كومينتر

مرحبًاSonictherocketman. شكرا على التقرير.

فكرتي الأولى هي أن هذا خطأ في واجهة برمجة تطبيقات العميل - فهو لا يميز بشكل مناسب بين معلمات سلسلة الاستعلام ونص الطلب عند إنشاء الطلب.

بشكل عام ، مجرد تعطيل التصفية للإجراءات غير الآمنة ليس صحيحًا. تحدث التصفية عند إنشاء مجموعة الاستعلام الأساسية التي سيتم إجراء تحديث عليها.

سأترك هذا مفتوحًا الآن ، فقط لأفكر فيه.

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

شكرًا على الرد السريع وأنا مهتم جدًا بأفكارك حول هذا الموضوع.

بشكل أو بآخر ، أعتقد أننا مقيدون هنا برغباتنا في إنشاء رمز تلقائي يتفوق على التكنولوجيا (في حالتها الحالية).

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

لكنها تتطور ، وتتطور الأدوات. سوف تتحسن.

أن هذا الخط بالذات:

client.action('book', 'create', { 'name': 'My Awesome Book' });

يستخدم نفس الأمر لكل من سلسلة الاستعلام ونص الطلب ليس رائعًا. أعتقد أنه التسريب التجريدي. تريد حقًا بناء هذا الطلب _ باليد_ ، وتحديد معلمات الاستعلام والجسم في أماكن منفصلة.

هذا ليس حاليًا أي شيء يمكننا معالجته هنا. شكرا مرة أخرى على التقرير بالرغم من ذلك.

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