Comment désactiver l'interface navigable de style administrateur de django-rest-framework?

150

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

iForêts
la source
Oui, les utilisateurs peuvent se connecter et utiliser l'API. Mais je ne veux pas leur montrer la page navigable de style administrateur.
iForests

Réponses:

246

Il vous suffit de supprimer le moteur de rendu API navigable de votre liste de moteurs de rendu pris en charge pour la vue.

Généralement:

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

Base par vue:

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

À part :

Dans de nombreux cas, je pense que c'est dommage que les gens choisissent de désactiver l'API navigable dans tous les cas, car c'est une grande aide pour tous les développeurs travaillant sur l'API, et cela ne leur donne pas plus d'autorisations qu'ils auraient autrement . Je peux voir qu'il peut y avoir des raisons commerciales de le faire dans certains cas, mais en général, je considère que c'est un énorme atout. Cependant, dans certains cas, il peut y avoir des détails affichés (comme les noms des actions personnalisées) qu'une API non publique peut ne pas vouloir exposer.

Voir également la réponse ci-dessous pour plus de détails sur la restriction du moteur de rendu d'API navigable au développement.

Tom Christie
la source
31
it's a big aid to any developers working on the API. Ne devraient-ils pas avoir des fichiers de paramètres pour le développement et la production? En développement, activez l'API navigable.
Jacob Valenta
11
@JacobValenta Je pense que Tom Christie veut dire que les développeurs tiers utilisant votre API devraient pouvoir utiliser l'API navigable.
Dustin Wyatt
1
Ouais, selon @DustinWyatt
Tom Christie
7
@TomChristie Tom, dans mon cas, les autorisations au niveau de la vue empêchent les utilisateurs non autorisés de voir plus que 401 dans l'API navigable, à l'exception de la vue Utilisateurs, car j'autorise les POST non autorisés à créer de nouveaux utilisateurs. Cela provoque l'affichage du formulaire HTML avec des données auto-complétées que je ne souhaite pas exposer. Existe-t-il un moyen simple d'éviter cela pour les utilisateurs non autorisés à court de créer un modèle personnalisé?
jeffjv
1
Je pensais juste que j'ajouterais que de nombreux clients gouvernementaux ou la plupart d'entre eux demanderaient explicitement que les méthodes de découverte (comme les interfaces API REST navigables) soient complètement désactivées. Je ne dis pas que c'est logique ou que c'est correct ... c'est juste.
Ray Pendergraph
74

Bien que la réponse acceptée à cette question réponde à la question telle qu'elle a été formulée, j'estime qu'elle ne résout pas le problème en question.

Pour être complet dans cette réponse, la désactivation de l'API HTML navigable se fait en la supprimant des classes de rendu comme suit:

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

Cependant, le problème réel auquel la question fait allusion est que les gens peuvent publier sur l'API sans authentification. Bien que la suppression du 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 soumissions POST non authentifiées ou non autorisées; cherchent à modifier les autorisations de l' API

Ce qui suit définira tous les points de terminaison pour qu'ils soient 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 navigable HTML car il répond aux autorisations. Lorsqu'un utilisateur authentifié se connecte, le formulaire est à nouveau disponible.

Tour bonus :

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
}
Routhinator
la source
7
Cela répond plus directement à la question que la réponse acceptée, la plus votée.
tortues sont mignonnes du
Si vous conservez des fichiers de configuration séparés pour le local et la production, vous pouvez simplement le mettre dans votre fichier de paramètres local.py (assurez-vous simplement de changer ce qui précède d'un tuple en une liste):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',
     )
 }

Ajoutez simplement ceci à votre Settings.py devrait désactiver l'API Browsable!

Syed Faizan
la source