Como desativar a interface navegável no estilo admin do django-rest-framework?

150

Estou usando o django-rest-framework . Ele fornece uma incrível API de auto-documentação navegável no estilo administrador do Django. Mas qualquer um pode visitar essas páginas e usar a interface para adicionar dados (POST). Como posso desabilitá-lo?

iForests
fonte
Sim, os usuários podem fazer login e usar a API. Mas não quero mostrar a página navegável no estilo de administrador para eles.
iForests

Respostas:

246

Você só precisa remover o renderizador de API navegável da sua lista de renderizadores suportados para a exibição.

Geralmente:

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

Base por visualização:

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

Fora :

Em muitos casos, acho uma pena que as pessoas optem por desativar a API navegável em qualquer caso, pois é uma grande ajuda para todos os desenvolvedores que trabalham na API e não lhes concede mais permissões do que teriam . Percebo que, em alguns casos, pode haver razões comerciais para fazê-lo , mas geralmente considero um grande ativo. Embora, em alguns casos, possam ser mostrados detalhes (como os nomes de ações personalizadas) que uma API não pública pode não querer expor.

Consulte também a resposta abaixo para obter mais detalhes sobre como restringir o renderizador de API navegável ao desenvolvimento.

Tom Christie
fonte
31
it's a big aid to any developers working on the API. Eles não deveriam ter arquivos de configurações para desenvolvimento e produção? Em desenvolvimento, ative a API navegável.
Jacob Valenta
11
@JacobValenta Acho que Tom Christie significa que desenvolvedores de terceiros que usam sua API devem poder usar a API navegável.
Dustin Wyatt
1
Sim, conforme @DustinWyatt
Tom Christie
7
@ TomChristie Tom, no meu caso, as permissões de nível de exibição estão impedindo que usuários não autorizados vejam algo mais que 401 na API navegável, com exceção da exibição Usuários, porque eu permito que POSTs não autorizados criem novos usuários. Isso faz com que o formulário HTML seja mostrado com dados preenchidos automaticamente que eu não quero expor. Existe uma maneira fácil de evitar isso para usuários não autorizados, sem criar um modelo personalizado?
jeffjv
1
Apenas pensei em adicionar muitos ou a maioria dos clientes governamentais, solicitando explicitamente que os métodos de descoberta (como interfaces de API REST navegáveis) sejam completamente desabilitados. Não estou dizendo que faz sentido ou que está correto ... apenas é.
Raio Pendergraph
74

Embora a resposta aceita para essa pergunta responda à pergunta como foi redigida, sinto que ela não resolve o problema real em questão.

Para ter uma resposta completa, desabilite a API HTML navegável removendo-a das classes de renderizador da seguinte maneira:

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

No entanto, o problema real ao qual a pergunta se refere é que as pessoas podem postar na API sem autenticação. Embora a remoção do formulário a torne menos óbvia, essa resposta não protege os pontos de extremidade da API.

No mínimo, alguém encontra essa pergunta e procura proteger a API contra envios POST não autenticados ou não autorizados; o está olhando para mudar o permissões da API

A seguir, todos os pontos de extremidade serão configurados como somente leitura, a menos que o usuário seja autenticado.

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

Se você deseja ocultar completamente a API, a menos que o usuário esteja logado, você também pode usar IsAuthenticated .

FYI: Isso também removerá o formulário da API navegável em HTML, pois responde às permissões. Quando um usuário autenticado efetua login, o formulário estará disponível novamente.

Rodada de Bônus :

Ative apenas a API HTML navegável no 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
fonte
7
Isso responde mais diretamente à pergunta do que a resposta aceita e mais votada.
Turtles Are Cute
Se você mantiver arquivos de configuração separados para local e de produção, você pode simplesmente colocar isso no seu arquivo de configurações local.py (apenas certifique-se de mudar o acima de um tuple a uma 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',
     )
 }

Basta adicionar isso ao seu Settings.py para desativar a API navegável!

Syed Faizan
fonte