Как отключить интерфейс администратора в стиле django-rest-framework?

150

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

iForests
источник
Да, пользователи могут войти и использовать API. Но я не хочу показывать им страницу с правами администратора.
iForests

Ответы:

246

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

В общем-то:

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

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

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

В сторону :

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

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

Том Кристи
источник
31
it's a big aid to any developers working on the API, Разве у них не должно быть файлов настроек для разработки и производства? В разработке включить браузерный API.
Джейкоб Валента
11
@JacobValenta Я думаю, что Том Кристи означает, что сторонние разработчики, использующие ваш API, должны иметь возможность использовать API с возможностью просмотра.
Дастин Уайатт
1
Да, согласно @DustinWyatt
Том Кристи
7
@ TomChristie Том, в моем случае разрешения уровня представления не позволяют неавторизованным пользователям видеть что-то больше 401 в доступном для просмотра API, за исключением представления «Пользователи», потому что я разрешаю неавторизованным POST создавать новых пользователей. Это приводит к тому, что форма HTML отображается с автозаполненными данными, которые я не хочу показывать. Есть ли простой способ предотвратить это для неавторизованных пользователей, если не сделать собственный шаблон?
jeffjv
1
Просто подумал, что я бы добавил, что многие или большинство государственных заказчиков явно просят полностью отключить методы обнаружения (например, интерфейсы API REST с возможностью просмотра). Я не говорю, что это имеет смысл или что это правильно ... это просто так.
Рэй Пендерграф
74

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

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

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.

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

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

Включите только 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
}
Routhinator
источник
7
Это более прямо отвечает на вопрос, чем принятый, получивший наибольшее количество голосов.
Черепахи милые
Если вы храните отдельные конфигурационные файлы для локального и производственного использования, вы можете просто поместить это в свой файл настроек local.py (просто убедитесь, что изменили вышеприведенное значение с кортежа на список):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',
     )
 }

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

Сайед Файзан
источник