【发布时间】:2020-03-12 01:18:44
【问题描述】:
在我的例子中,我使用 Django REST Framework (DRF) 作为内部 api。它不适合普通用户使用。因此我想为普通用户禁用它。
管理员 (is_staff=True) 应该能够访问并看到它:
https://restframework.herokuapp.com/
非员工用户 (is_staff=False) 应该只获得 GET 请求的 JSON 响应,例如:
https://restframework.herokuapp.com/?format=json
他应该不(!)看到可浏览的 api。这适用于根视图和所有端点。
为了配置它,我应用了以下内容:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.SessionAuthentication'],
'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated'],
}
我的端点如下(为了保持示例简单,我只显示 1):
# api/urls.py
from django.urls import include, path
from rest_framework import routers
from . import views
app_name = 'api'
router = routers.DefaultRouter() # browseable api
router.register('segments', views.SegmentViewSet)
# there are a lot more...
urlpatterns = [
path('', include(router.urls)),
]
基于答案https://stackoverflow.com/a/58894198/420953 我的settings.py 看起来像这样:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.SessionAuthentication'],
'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated'],
# enable JSON renderer by default
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
],
}
还有我的api/views.py:
# api/views.py
from django_filters import rest_framework as drf_filters
from rest_framework import filters, renderers, viewsets
from . import serializers
from segment.models import Segment
class StaffBrowsableAPIMixin:
def get_renderers(self):
"""
add BrowsableAPIRenderer if user is staff (regular users see JSONRenderer response)
"""
# explicitly set renderer to JSONRenderer (the default for non staff users)
rends = [renderers.JSONRenderer]
if self.request.user.is_staff:
# staff users see browsable API
rends.append(renderers.BrowsableAPIRenderer)
return [renderer() for renderer in rends]
class SegmentViewSet(StaffBrowsableAPIMixin, viewsets.ReadOnlyModelViewSet):
queryset = Segment.objects.all()
serializer_class = serializers.SegmentSerializer
这适用于所有端点(当普通用户通过 GET 调用端点时,他们只能看到 JSON,而不是可浏览的 API)。不幸的是,它不适用于APIRootView(api 的根视图,例如https://restframework.herokuapp.com/)。
如何让它也适用于APIRootView?
【问题讨论】:
-
你得到了什么结果?
-
能否请您检查您正在登录的用户是否将属性 is_staff 设置为 true 或 false?
-
谢谢你!正是我想要的。错过了这篇文章。
-
乐于助人:)
标签: python django django-rest-framework