Bagaimana menonaktifkan antarmuka admin-gaya django-rest-framework?

150

Saya menggunakan django-rest-framework . Ini memberikan Django admin style mengagumkan yang dapat didokumentasikan API self-documenting. Tetapi siapa pun dapat mengunjungi halaman-halaman itu dan menggunakan antarmuka untuk menambahkan data (POST). Bagaimana saya bisa menonaktifkannya?

iForest
sumber
Ya, pengguna dapat masuk dan menggunakan API. Tetapi saya tidak ingin menunjukkan halaman yang dapat dijelajahi dengan gaya admin kepada mereka.
iForests

Jawaban:

246

Anda hanya perlu menghapus renderer API yang dapat dijelajahi dari daftar renderer yang didukung untuk tampilan.

Umumnya:

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

Per-view basis:

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

Selain :

Dalam banyak kasus saya pikir itu memalukan bahwa orang akan memilih untuk menonaktifkan API yang dapat dijelajahi dalam hal apa pun, karena ini merupakan bantuan besar bagi setiap pengembang yang bekerja pada API, dan itu tidak memberi mereka lebih banyak izin yang seharusnya mereka miliki . Saya dapat melihat bahwa mungkin ada alasan bisnis untuk melakukannya dalam beberapa kasus, tetapi umumnya saya menganggapnya sebagai aset besar. Meskipun, dalam beberapa kasus mungkin ada detail yang ditampilkan (seperti nama tindakan khusus) yang mungkin tidak ingin diungkapkan oleh API non-publik.

Lihat juga jawaban di bawah ini untuk detail lebih lanjut tentang membatasi rendering API yang dapat dijelajahi ke pengembangan.

Tom Christie
sumber
31
it's a big aid to any developers working on the API. Tidakkah seharusnya mereka memiliki file pengaturan untuk pengembangan dan produksi? Dalam pengembangan, aktifkan API yang dapat dijelajahi.
Jacob Valenta
11
@ JacobValenta Saya pikir Tom Christie berarti pengembang pihak ketiga yang menggunakan API Anda harus dapat menggunakan API yang dapat dijelajahi.
Dustin Wyatt
1
Yup, sesuai @DustinWyatt
Tom Christie
7
@ TomChristie Tom, dalam kasus saya izin tingkat tampilan mencegah pengguna yang tidak sah melihat lebih dari 401 di api yang dapat dijelajahi dengan pengecualian tampilan Pengguna karena saya mengizinkan POST yang tidak sah untuk membuat pengguna baru. Ini menyebabkan formulir HTML ditampilkan dengan data yang dilengkapi secara otomatis yang tidak ingin saya ungkapkan. Apakah ada cara mudah untuk mencegah hal ini bagi pengguna yang tidak memiliki izin untuk membuat template khusus?
jeffjv
1
Saya pikir saya akan menambahkan banyak atau sebagian besar pelanggan pemerintah secara eksplisit meminta metode penemuan (seperti antarmuka REST API yang dapat dijelajahi) untuk sepenuhnya dinonaktifkan. Saya tidak mengatakan itu masuk akal atau itu benar ... hanya saja.
Ray Pendergraph
74

Sementara jawaban yang diterima untuk pertanyaan ini memang menjawab pertanyaan seperti yang telah dikatakan, saya merasa bahwa itu tidak menyelesaikan masalah aktual yang ada.

Untuk melengkapi dalam jawaban ini, menonaktifkan api HTML yang dapat ditelusuri dilakukan dengan menghapusnya dari kelas renderer seperti:

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

Namun, masalah aktual yang disinggung pertanyaan adalah orang-orang dapat memposting ke API tanpa otentikasi. Saat menghapus formulir membuatnya kurang jelas, jawaban ini tidak melindungi titik akhir API.

Minimal, seseorang menemukan pertanyaan ini dan ingin melindungi API dari pengiriman POST yang tidak diautentikasi, atau tidak sah; mereka ingin mengubah Izin API

Berikut ini akan menetapkan semua titik akhir hanya untuk dibaca kecuali jika pengguna diautentikasi.

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

Jika Anda ingin menyembunyikan API sepenuhnya kecuali jika pengguna masuk, Anda juga bisa menggunakan IsAuthenticated.

FYI: Ini juga akan menghapus formulir dari API HTML yang dapat ditelusuri saat menanggapi izin. Ketika pengguna yang diautentikasi masuk, formulir akan tersedia lagi.

Putaran Bonus :

Hanya aktifkan API HTML yang dapat ditelusuri di 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
sumber
7
Ini lebih langsung menjawab pertanyaan daripada jawaban yang diterima dan paling banyak dipilih.
Turtles Are Cute
Jika Anda menyimpan file konfigurasi terpisah untuk lokal dan produksi, Anda bisa memasukkan ini ke file pengaturan local.py Anda (pastikan untuk mengubah yang di atas dari tuple ke daftar):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',
     )
 }

Cukup Tambahkan ini ke Pengaturan Anda .py harus menonaktifkan API dijelajahi!

Syed Faizan
sumber