¿Cómo deshabilitar la interfaz navegable de estilo administrador de django-rest-framework?

150

Estoy usando django-rest-framework . Proporciona una impresionante API de autodocumentación navegable de estilo administrativo de Django. Pero cualquiera puede visitar esas páginas y usar la interfaz para agregar datos (POST). ¿Cómo puedo desactivarlo?

iForests
fuente
Sí, los usuarios pueden iniciar sesión y usar la API. Pero no quiero mostrarles la página navegable de estilo administrador.
iForests

Respuestas:

246

Solo necesita eliminar el renderizador API navegable de su lista de renderizadores compatibles para la vista.

Generalmente:

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

Por vista base:

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

Aparte :

En muchos casos, creo que es una lástima que la gente elija deshabilitar la API navegable en cualquier caso, ya que es una gran ayuda para cualquier desarrollador que trabaje en la API, y no les da más permisos que de lo contrario tendrían . Puedo ver que puede haber razones comerciales para hacerlo en algunos casos, pero en general lo consideraría un gran activo. Aunque, en algunos casos, pueden mostrarse detalles (como los nombres de acciones personalizadas) que una API no pública puede no querer exponer.

Consulte también la respuesta a continuación para obtener más detalles sobre cómo restringir el renderizador de API navegable al desarrollo.

Tom Christie
fuente
31
it's a big aid to any developers working on the API. ¿No deberían tener archivos de configuración para el desarrollo y la producción? En desarrollo, habilite la API navegable.
Jacob Valenta
11
@JacobValenta Creo que Tom Christie significa que los desarrolladores de terceros que usan su API deberían poder usar la API navegable.
Dustin Wyatt
1
Sí, según @DustinWyatt
Tom Christie
77
@ TomChristie Tom, en mi caso, los permisos de nivel de vista impiden que los usuarios no autorizados vean más de 401 en la API navegable, con la excepción de la vista de Usuarios porque permito que POST no autorizados creen nuevos usuarios. Esto hace que el formulario HTML se muestre con datos autocompletados que no quiero exponer. ¿Hay alguna manera fácil de evitar esto para usuarios no autorizados que no sean para crear una plantilla personalizada?
jeffjv
1
Solo pensé que agregaría que muchos o la mayoría de los clientes gubernamentales solicitan explícitamente que los métodos de descubrimiento (como las interfaces REST API navegables) estén completamente deshabilitados. No digo que tenga sentido o que sea correcto ... simplemente lo es.
Ray Pendergraph el
74

Si bien la respuesta aceptada a esta pregunta responde a la pregunta tal como fue redactada, creo que no resuelve el problema real en cuestión.

Para completar esta respuesta, deshabilitar la API HTML explorable se realiza quitándola de las clases de renderizador de esta manera:

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

Sin embargo, el problema real al que alude la pregunta es que las personas pueden publicar en la API sin autenticación. Si bien eliminar el formulario lo hace menos obvio, esta respuesta no protege los puntos finales de la API.

Como mínimo, alguien encuentra esta pregunta y busca proteger la API de envíos POST no autenticados o no autorizados; buscan cambiar los permisos de la API

Lo siguiente establecerá que todos los puntos finales sean de solo lectura a menos que el usuario esté autenticado.

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

Si desea ocultar completamente la API a menos que el usuario haya iniciado sesión, también puede usarla IsAuthenticated.

FYI: Esto también eliminará el formulario de la API de navegación HTML, ya que responde a los permisos. Cuando un usuario autenticado inicia sesión, el formulario estará disponible nuevamente.

Ronda de bonificación :

Solo habilite la API HTML explorable en 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
fuente
77
Esto responde más directamente a la pregunta que la respuesta aceptada y más votada.
tortugas son lindas el
Si mantiene archivos de configuración separados para local y producción, simplemente puede poner esto en su archivo de configuración local.py (solo asegúrese de cambiar lo anterior de una tupla a una lista):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',
     )
 }

¡Solo agregue esto a su Settings.py debería deshabilitar la API navegable!

Syed Faizan
fuente