Come disabilitare l'interfaccia navigabile in stile admin di django-rest-framework?


150

Sto usando django-rest-framework . Fornisce una fantastica API autocompattante consultabile in stile admin di Django. Ma chiunque può visitare quelle pagine e utilizzare l'interfaccia per aggiungere dati (POST). Come posso disabilitarlo?


Sì, gli utenti possono accedere e utilizzare l'API. Ma non voglio mostrare loro la pagina navigabile in stile admin.
iForests

Risposte:


246

Devi solo rimuovere il renderer API navigabile dal tuo elenco di renderer supportati per la vista.

Generalmente:

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

Base per visualizzazione:

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

A parte :

In molti casi penso che sia un peccato che la gente scelga di disabilitare l'API navigabile in ogni caso, poiché è un grande aiuto per tutti gli sviluppatori che lavorano sull'API e non dà loro più autorizzazioni che altrimenti avrebbero . Vedo che in alcuni casi potrebbero esserci ragioni commerciali per farlo , ma in generale lo considero un grande vantaggio. Tuttavia, in alcuni casi potrebbero essere mostrati dettagli (come i nomi delle azioni personalizzate) che un'API non pubblica potrebbe non voler esporre.

Vedi anche la risposta di seguito per maggiori dettagli sulla limitazione allo sviluppo del renderer API navigabile.


31
it's a big aid to any developers working on the API. Non dovrebbero avere file di impostazioni per lo sviluppo e la produzione? In fase di sviluppo abilitare l'API navigabile.
Jacob Valenta,

11
@JacobValenta Penso che Tom Christie significhi che gli sviluppatori di terze parti che utilizzano la tua API dovrebbero essere in grado di utilizzare l'API navigabile.
Dustin Wyatt,

1
Sì, come da @DustinWyatt
Tom Christie,

7
@TomChristie Tom, nel mio caso le autorizzazioni a livello di vista impediscono agli utenti non autorizzati di vedere qualcosa di più di 401 nell'API navigabile, ad eccezione della vista Utenti perché consento ai POST non autorizzati di creare nuovi utenti. Questo fa sì che il modulo HTML venga mostrato con i dati compilati automaticamente che non voglio esporre. Esiste un modo semplice per impedirlo agli utenti non autorizzati di creare un modello personalizzato?
jeffjv,

1
Ho solo pensato di aggiungere molti o la maggior parte dei clienti del governo chiedendo esplicitamente che i metodi di rilevamento (come le interfacce API REST sfogliabili) siano completamente disabilitati. Non sto dicendo che abbia senso o che sia corretto ... lo è e basta.
Ray Pendergraph,

74

Mentre la risposta accettata a questa domanda risponde alla domanda così come è stata formulata, ritengo che non risolva il problema attuale.

Per completezza in questa risposta, la disabilitazione dell'API HTML navigabile viene eseguita rimuovendola dalle classi del renderer in questo modo:

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

Tuttavia, il vero problema a cui si pone la domanda è che le persone possono pubblicare nell'API senza autenticazione. La rimozione del modulo lo rende meno ovvio, questa risposta non protegge gli endpoint API.

Come minimo, qualcuno trova questa domanda e sta cercando di proteggere l'API da invii POST non autenticati o non autorizzati; stanno cercando di modificare le autorizzazioni API

Quanto segue imposterà la lettura di tutti gli endpoint a meno che l'utente non sia autenticato.

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

Se desideri nascondere completamente l'API a meno che l'utente non abbia effettuato l'accesso, puoi anche utilizzare IsAuthenticated.

Cordiali saluti: Questo rimuoverà anche il modulo dall'API navigabile HTML mentre risponde alle autorizzazioni. Quando un utente autenticato accede, il modulo sarà nuovamente disponibile.

Round bonus :

Abilita l'API HTML navigabile solo in sviluppo:

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
}

7
Ciò risponde più direttamente alla domanda rispetto alla risposta accettata e più votata.
tartarughe sono carine il

Se mantieni file di configurazione separati per locale e produzione, puoi semplicemente metterlo nel tuo file di impostazioni local.py (assicurati di cambiare quanto sopra da una tupla a un elenco):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',
     )
 }

Basta aggiungere questo al tuo Settings.py dovrebbe disabilitare l'API Navigabile!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.