2013-07-12 6 views
7

Was ist der beste Weg, um die Elemente pro Seite in Django REST-Framework zu begrenzen? Ich setze PAGINATE_BY = 20 und PAGINATE_BY_PARAM. Ohne Parameter erhalten Sie 20 Items, aber es ist auch möglich 4000 Items über den Paginate Param zu bekommen. Diese Anfragen sind sehr schwer und nicht sehr nützlich, aber perfekt für Script Kiddies.Grenze pro Seite in Django REST-Framework

Jarus

Antwort

5

Wenn Sie auf das Überschreiben der get_paginate_by Methode auf den generischen Ansichten, die eine harte Obergrenze Blick einzustellen.

+0

Es ist nicht die sauberste Lösung aber es funktioniert gut. – Jarus

+0

Sie können gerne eine Pull-Anfrage für eine MAX_PAGINATE_BY-Einstellung senden. –

5

Sie müssen PAGINATE_BY als doc Staaten setzen:

PAGINATE_BY: Die Standard-Seitengröße für Paginierung zu verwenden. Wenn auf None, wird Paginierung standardmäßig deaktiviert

PAGINATE_BY_PARAM ist für Benutzer die Standardgröße außer Kraft zu setzen. Also, wenn Sie Angst vor seinem Missbrauch haben, aktivieren Sie es nicht.

PAGINATE_BY_PARAM: Der Name eines Abfrageparameter, die von der Client verwendet werden kann, die Standardseitengröße außer Kraft zu setzen für die Paginierung zu verwenden. Wenn auf None festgelegt ist, können Clients die Standardseitengröße nicht überschreiben.

+0

Beachten Sie, dass 'PAGINATE_BY' und' PAGINATE_BY_PARAM' jetzt Abschreibungen anstehen: http://www.django-rest-framework.org/api-guide/generic-views/ – Tristan

3

Setzen Sie 'MAX_PAGINATE_BY', um die globalen maximalen Ergebnisse pro Seite zu konfigurieren, wie die doc angibt.

Beispiel aus den doc:

REST_FRAMEWORK = { 
    'PAGINATE_BY': 10,     # Default to 10 
    'PAGINATE_BY_PARAM': 'page_size', # Allow client to override, using `?page_size=xxx`. 
    'MAX_PAGINATE_BY': 100    # Maximum limit allowed when using `?page_size=xxx`. 
} 

max_paginate_by Auf eine per-View- Basis für eine harte Obergrenze pro Seite zu konfigurieren.

Beispiel aus dem doc:

class PaginatedListView(ListAPIView): 
    queryset = ExampleModel.objects.all() 
    serializer_class = ExampleModelSerializer 
    paginate_by = 10 
    paginate_by_param = 'page_size' 
    # Set MAX results per page 
    max_paginate_by = 100 
3

besser gehen durch Pagination

Die PageNumberPagination Klasse eine Reihe von attributes enthält, die die Paginierung Stil zu ändern, außer Kraft gesetzt werden können.

class ItemSetPagination(PageNumberPagination): 
    page_size = 1000 
    page_size_query_param = 'page_size' 
    max_page_size = 10000 

pagination_class = ItemSetPagination