Làm cách nào để tắt giao diện có thể duyệt theo kiểu quản trị viên của django-rest-framework?


150

Tôi đang sử dụng django-rest-framework . Nó cung cấp một API tự ghi tài liệu theo phong cách quản trị viên Django tuyệt vời. Nhưng bất cứ ai cũng có thể truy cập các trang đó và sử dụng giao diện để thêm dữ liệu (POST). Làm thế nào tôi có thể vô hiệu hóa nó?


Có, người dùng có thể đăng nhập và sử dụng API. Nhưng tôi không muốn hiển thị trang có thể duyệt theo kiểu quản trị viên cho họ.
iForests

Câu trả lời:


246

Bạn chỉ cần xóa trình kết xuất API có thể duyệt khỏi danh sách trình kết xuất được hỗ trợ để xem.

Nói chung là:

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

Cơ sở mỗi lượt xem:

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

Ngoài ra :

Trong nhiều trường hợp, tôi nghĩ rằng thật đáng tiếc khi mọi người sẽ chọn vô hiệu hóa API có thể duyệt trong mọi trường hợp, vì nó là một trợ giúp lớn cho bất kỳ nhà phát triển nào làm việc trên API và nó không cung cấp cho họ nhiều quyền hơn mà họ có . Tôi có thể thấy rằng có thể có lý do kinh doanh để làm như vậy trong một số trường hợp, nhưng nói chung tôi coi đó là một tài sản lớn. Mặc dù, trong một số trường hợp, có thể có các chi tiết được hiển thị (như tên của các hành động tùy chỉnh) mà API không công khai có thể không muốn tiết lộ.

Xem thêm câu trả lời bên dưới để biết thêm chi tiết về việc hạn chế trình kết xuất API có thể duyệt để phát triển.


31
it's a big aid to any developers working on the API. Họ không nên có các tệp cài đặt để phát triển và sản xuất? Trong phát triển cho phép API có thể duyệt.
Jacob Valenta

11
@JacobValenta Tôi nghĩ Tom Christie có nghĩa là các nhà phát triển bên thứ ba sử dụng API của bạn sẽ có thể sử dụng API có thể duyệt được.
Dustin Wyatt

1
Yup, theo @DustinWyatt
Tom Christie

7
@TomChristie Tom, trong trường hợp của tôi, quyền cấp độ xem đang ngăn người dùng trái phép nhìn thấy bất cứ thứ gì sau đó là 401 trong api có thể duyệt được ngoại trừ chế độ xem Người dùng vì tôi cho phép POST trái phép tạo người dùng mới. Điều này khiến biểu mẫu HTML được hiển thị với dữ liệu tự động hoàn thành mà tôi không muốn phơi bày. Có cách nào dễ dàng để ngăn chặn điều này đối với người dùng trái phép khi tạo mẫu tùy chỉnh không?
jeffjv

1
Chỉ cần nghĩ rằng tôi sẽ thêm nhiều hoặc hầu hết các khách hàng chính phủ yêu cầu rõ ràng các phương thức khám phá (như giao diện API REST có thể duyệt) sẽ bị vô hiệu hóa hoàn toàn. Tôi không nói nó có ý nghĩa hay nó đúng ... nó chỉ là như vậy.
Ray Pendergraph

74

Mặc dù câu trả lời được chấp nhận cho câu hỏi này không trả lời câu hỏi như đã được nói, tôi cảm thấy rằng nó không giải quyết được vấn đề thực tế trong tay.

Để hoàn thiện câu trả lời này, việc vô hiệu hóa api HTML có thể duyệt được thực hiện bằng cách xóa nó khỏi các lớp kết xuất như vậy:

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

Tuy nhiên, vấn đề thực sự mà câu hỏi ám chỉ là mọi người có thể đăng lên API mà không cần xác thực. Mặc dù việc xóa biểu mẫu làm cho nó ít rõ ràng hơn, câu trả lời này không bảo vệ các điểm cuối API.

Tối thiểu, ai đó tìm thấy câu hỏi này và đang tìm cách bảo vệ API khỏi các bài nộp POST không được xác thực hoặc không được ủy quyền; họ đang tìm cách thay đổi Quyền API

Sau đây sẽ đặt tất cả các điểm cuối chỉ được đọc trừ khi người dùng được xác thực.

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

Nếu bạn muốn ẩn hoàn toàn API trừ khi người dùng đăng nhập, bạn cũng có thể sử dụng IsAuthenticated.

FYI: Điều này cũng sẽ xóa biểu mẫu khỏi API có thể duyệt HTML khi nó phản hồi các quyền. Khi người dùng được xác thực đăng nhập, biểu mẫu sẽ có sẵn một lần nữa.

Vòng thưởng :

Chỉ kích hoạt API HTML có thể duyệt trong 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
}

7
Điều này trực tiếp trả lời câu hỏi hơn câu trả lời được chấp nhận nhiều nhất.
Rùa dễ thương

Nếu bạn giữ các tệp cấu hình riêng biệt cho cục bộ và sản xuất, bạn chỉ có thể đặt tệp này trong tệp cài đặt local.txt của mình (chỉ cần đảm bảo thay đổi phần trên từ một tuple thành danh sách):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',
     )
 }

Chỉ cần thêm phần này vào Cài đặt của bạn sẽ vô hiệu hóa API có thể duyệt!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.