Jak wyłączyć interfejs django-rest-framework w stylu administratora?

150

Używam django-rest-framework . Zapewnia niesamowity, samodokumentujący się interfejs API w stylu administratora Django. Ale każdy może odwiedzić te strony i użyć interfejsu do dodawania danych (POST). Jak mogę to wyłączyć?

iForests
źródło
Tak, użytkownicy mogą się zalogować i korzystać z API. Ale nie chcę im pokazywać strony do przeglądania w stylu administratora.
iForests

Odpowiedzi:

246

Wystarczy usunąć moduł renderujący interfejsu API z możliwością przeglądania z listy obsługiwanych mechanizmów renderowania dla tego widoku.

Ogólnie:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

Podstawa wyświetlenia:

class MyView(...):
    renderer_classes = [renderers.JSONRenderer]

Poza :

W wielu przypadkach myślę, że to wstyd, że ludzie zdecydowaliby się wyłączyć interfejs API z możliwością przeglądania w każdym przypadku, ponieważ jest to duża pomoc dla programistów pracujących nad interfejsem API i nie daje im więcej uprawnień, które mieliby w innym przypadku . Widzę, że w niektórych przypadkach mogą istnieć biznesowe powody, aby to zrobić , ale generalnie uważam to za ogromny atut. Chociaż w niektórych przypadkach mogą być wyświetlane szczegóły (takie jak nazwy akcji niestandardowych), których niepubliczny interfejs API może nie chcieć ujawniać.

Zobacz również odpowiedź poniżej, aby uzyskać więcej informacji na temat ograniczania modułu renderowania interfejsu API z możliwością przeglądania do programowania.

Tom Christie
źródło
31
it's a big aid to any developers working on the API. Czy nie powinni mieć plików ustawień do programowania i produkcji? W trakcie opracowywania włącz przeglądalny interfejs API.
Jacob Valenta,
11
@JacobValenta Myślę, że Tom Christie ma na myśli, że deweloperzy zewnętrzni używający twojego API powinni mieć możliwość korzystania z API z możliwością przeglądania.
Dustin Wyatt,
1
Tak, zgodnie z @DustinWyatt
Tom Christie
7
@TomChristie Tom, w moim przypadku uprawnienia na poziomie widoku uniemożliwiają nieautoryzowanym użytkownikom zobaczenie czegoś więcej niż 401 w interfejsie API możliwym do przeglądania, z wyjątkiem widoku Użytkownicy, ponieważ zezwalam nieautoryzowanym POST na tworzenie nowych użytkowników. Powoduje to, że formularz HTML jest wyświetlany z automatycznie uzupełnionymi danymi, których nie chcę ujawniać. Czy istnieje prosty sposób, aby temu zapobiec w przypadku nieautoryzowanych użytkowników, poza utworzeniem szablonu niestandardowego?
jeffjv
1
Pomyślałem, że dodam wielu lub większość klientów rządowych wyraźnie proszących o całkowite wyłączenie metod wykrywania (takich jak interfejsy REST API z możliwością przeglądania). Nie mówię, że to ma sens lub że jest poprawne ... po prostu jest.
Ray Pendergraph
74

Chociaż przyjęta odpowiedź na to pytanie odpowiada na pytanie tak, jak została sformułowana, uważam, że nie rozwiązuje ona rzeczywistego problemu.

Aby uzyskać kompletność w tej odpowiedzi, wyłączenie interfejsu API HTML z możliwością przeglądania odbywa się poprzez usunięcie go z klas renderowania, w następujący sposób:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

Jednak faktycznym problemem, do którego odnosi się pytanie, jest możliwość wysyłania postów do API bez uwierzytelniania. Chociaż usunięcie formularza czyni go mniej oczywistym, ta odpowiedź nie chroni punktów końcowych interfejsu API.

Jako minimum, ktoś znajduje to pytanie i chce chronić API przed nieuwierzytelnionymi lub nieautoryzowanymi zgłoszeniami POST; chcą zmienić uprawnienia API

Poniższe ustawienia ustawią wszystkie punkty końcowe jako tylko do odczytu, chyba że użytkownik jest uwierzytelniony.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    )
}

Jeśli chcesz całkowicie ukryć API, chyba że użytkownik jest zalogowany, możesz również użyć IsAuthenticated.

Do Twojej wiadomości: Spowoduje to również usunięcie formularza z interfejsu API z możliwością przeglądania w formacie HTML, ponieważ odpowiada on na uprawnienia. Gdy zaloguje się uwierzytelniony użytkownik, formularz będzie ponownie dostępny.

Runda bonusowa :

Włączaj interfejs API HTML z możliwością przeglądania tylko w wersji deweloperskiej:

DEFAULT_RENDERER_CLASSES = (
    'rest_framework.renderers.JSONRenderer',
)

if DEBUG:
    DEFAULT_RENDERER_CLASSES = DEFAULT_RENDERER_CLASSES + (
        'rest_framework.renderers.BrowsableAPIRenderer',
    )

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
    'DEFAULT_RENDERER_CLASSES': DEFAULT_RENDERER_CLASSES
}
Routhinator
źródło
7
To bardziej bezpośrednio odpowiada na pytanie niż przyjęta, najczęściej wybierana odpowiedź.
Żółwie są słodkie
Jeśli przechowujesz osobne pliki konfiguracyjne dla lokalnego i produkcyjnego, możesz po prostu umieścić to w swoim pliku ustawień local.py (pamiętaj tylko, aby zmienić powyższą krotkę na listę): REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'].append('rest_framework.renderers.BrowsableAPIRenderer')
getup8
2
import rest_framework

For Production Only
 REST_FRAMEWORK = {
     'DEFAULT_RENDERER_CLASSES': (
         'rest_framework.renderers.JSONRenderer',
     )
 }

Wystarczy dodać to do swojego Settings.py, aby wyłączyć Browsable API!

Syed Faizan
źródło