web-dev-qa-db-fra.com

Comment désactiver l'interface navigable de type admin de Django-rest-framework?

J'utilise Django-rest-framework . Il fournit une impressionnante Django API autodocumentée navigable de style admin. Mais n'importe qui peut visiter ces pages et utiliser l'interface pour ajouter des données (POST). Comment puis-je le désactiver?

129
iForests

Il vous suffit de supprimer le rendu de l'API pouvant être parcouru de votre liste de rendus de rendu pris en charge pour la vue.

Vous pouvez le faire globalement comme ceci:

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

Ou sur une base individuelle, comme ceci:

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

De côté: Dans de nombreux cas, je pense que c'est dommage que les gens choisissent de désactiver l'API navigable de toute façon, car c'est une aide précieuse pour tous les développeurs travaillant sur l'API, et il doesn 'ne leur donnez pas plus d'autorisations qu'ils auraient autrement. Je peux voir qu’il pourrait y avoir des raisons d’affaires pour le faire dans des cas certains, mais en général, je considérerais cela comme un atout considérable.

214
Tom Christie

Bien que la réponse acceptée à cette question réponde à la question telle qu’elle était libellée, j’estime que cela ne résout pas le problème.

Pour être complet dans cette réponse, la désactivation de l’API HTML pouvant être parcourue est effectuée en le supprimant des classes de rendu de la manière suivante:

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

Toutefois, le problème auquel la question fait allusion est le fait que des personnes puissent publier sur l'API sans authentification. Bien que supprimer le formulaire le rend moins évident, cette réponse ne protège pas les points de terminaison de l'API.

Au minimum, quelqu'un trouve cette question et cherche à protéger l'API contre les envois non authentifiés ou non autorisés POST; ils cherchent à modifier Autorisations d'API

Les éléments suivants définissent tous les points de terminaison en lecture seule, à moins que l'utilisateur ne soit authentifié.

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

Si vous souhaitez masquer complètement l'API à moins que l'utilisateur ne soit connecté, vous pouvez également utiliser IsAuthenticated.

FYI: Cela supprimera également le formulaire de l'API HTML consultable car il répond aux autorisations. Lorsqu'un utilisateur authentifié se connecte, le formulaire sera à nouveau disponible.

Bonus Round :

Activez uniquement l'API HTML navigable dans dev:

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
}
45
Routhinator
import rest_framework

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

Il suffit d’ajouter ceci à votre fichier Settings.py pour désactiver l’API navigable!

2
Syed Faizan

Retirer le 'rest_framework.renderers.BrowsableAPIRenderer', du 'DEFAULT_RENDERER_CLASSES' dans vos paramètres

0
A.Raouf