Як відключити браузерний інтерфейс для django-rest-frame?


150

Я використовую django-rest-frame . Він надає дивовижний API для самодокументування в стилі адміністратора Django. Але кожен може відвідати ці сторінки та використовувати інтерфейс для додавання даних (POST). Як я можу його відключити?


Так, користувачі можуть увійти та використовувати 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 Tom, в моєму випадку дозволи на рівні перегляду забороняють стороннім користувачам бачити що-небудь більше 401 у переглянутому api, за винятком перегляду "Користувачі", тому що я дозволяю несанкціонованим POST створювати нових користувачів. Це призводить до відображення форми HTML із автоматично заповненими даними, які я не хочу виставляти. Чи є простий спосіб запобігти цьому для несанкціонованих користувачів, якщо вони не створюють спеціальний шаблон?
jeffjv

1
Просто думав, що я б додав багато або більшість державних замовників явно просять способи виявлення (наприклад, інтерфейси інтерфейсу API REST) ​​бути повністю відключені. Я не кажу, що це має сенс або що це правильно ... це просто так.
Рей Пендерграф

74

Хоча прийнята відповідь на це питання відповідає на питання так, як це було сформульовано, я вважаю, що це не вирішує фактичну проблему.

Для повноти в цій відповіді вимкнення 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.

FYI: Це також видалить форму з API для перегляду HTML, оскільки вона відповідає на дозволи. Коли авторизований користувач увійде в систему, форма знову буде доступна.

Раунд бонусів :

Увімкніть HTML-API, який можна переглядати, лише в програмі:

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
Це більш прямо відповідає на питання, ніж прийнята, найбільше схвалена відповідь.
Черепахи милі

Якщо ви зберігаєте окремі конфігураційні файли для локальних та виробничих, ви можете просто помістити це у свій файл налаштувань 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, слід вимкнути API для перегляду!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.