Как отключить браузерный интерфейс для просмотра django-rest-framework?

Я использую django-rest-framework. Он предоставляет потрясающий API-интерфейс, поддерживающий API-интерфейс Django, который можно просматривать самостоятельно. Но каждый может посетить эти страницы и использовать интерфейс для добавления данных (POST). Как отключить его?

Ответ 1

Вам просто нужно удалить средство просмотра API с возможностью просмотра из списка поддерживаемых средств отображения для представления.

Как правило:

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

На основе просмотра:

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

В сторону:

Во многих случаях мне кажется обидным, что люди в любом случае решили отключить API с возможностью просмотра, поскольку это очень помогает разработчикам, работающим над API, и не дает им больше разрешений, чем они могли бы иметь. Я вижу, что в некоторых случаях для этого могут быть деловые причины, но в целом я считаю это огромным преимуществом. Хотя в некоторых случаях могут отображаться подробности (например, имена пользовательских действий), которые непубличный API может не захотеть раскрывать.

См. также ответ ниже для получения более подробной информации об ограничении просматриваемого API-рендеринга для разработки.

Ответ 2

Хотя принятый ответ на этот вопрос действительно отвечает на вопрос в том виде, как он был сформулирован, я чувствую, что он не решает актуальную проблему под рукой.

Для полноты в этом ответе отключение просматриваемого HTML-интерфейса API выполняется путем удаления его из классов визуализации следующим образом:

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

Тем не менее, фактическая проблема, на которую ссылается этот вопрос, заключается в том, что люди могут отправлять сообщения в API без аутентификации. Хотя удаление формы делает ее менее очевидной, этот ответ не защищает конечные точки API.

Как минимум, кто-то находит этот вопрос и пытается защитить API от неаутентифицированных или неавторизованных отправлений POST; вы хотите изменить разрешения API

Следующее установит все конечные точки только для чтения, если пользователь не аутентифицирован.

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

Если вы хотите полностью скрыть API, если пользователь не вошел в систему, вы также можете использовать IsAuthenticated.

К вашему сведению: это также приведет к удалению формы из просматриваемого HTML-API, поскольку она отвечает на разрешения. Когда авторизованный пользователь входит в систему, форма снова будет доступна.

Бонусный раунд:

Включите просматриваемый HTML API только в 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
}

Ответ 3

import rest_framework

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

Просто добавьте это в файл Settings.py, чтобы отключить интерфейс Browsable API!

Ответ 4

Удалите 'rest_framework.renderers.BrowsableAPIRenderer', из 'DEFAULT_RENDERER_CLASSES' в ваших настройках