Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST框架-如何为非工作人员用户禁用可浏览API(is_staff=False)_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django REST框架-如何为非工作人员用户禁用可浏览API(is_staff=False)

Python Django REST框架-如何为非工作人员用户禁用可浏览API(is_staff=False),python,django,django-rest-framework,Python,Django,Django Rest Framework,在我的例子中,我使用Django REST框架(DRF)作为内部api。它不打算被普通用户使用。因此,我想为普通用户禁用它 管理员(is_staff=True)应该能够访问并查看它: 非工作人员用户(is_staff=False)应该只获取get请求的JSON响应,如: 他应该而不是(!)查看可浏览的api。这适用于根视图和所有端点 为了进行配置,我应用了以下内容: #settings.py REST_框架={ “默认\u身份验证\u类”:[“rest\u framework.AUTHENTI

在我的例子中,我使用Django REST框架(DRF)作为内部api。它不打算被普通用户使用。因此,我想为普通用户禁用它

管理员(
is_staff=True
)应该能够访问并查看它:

非工作人员用户(
is_staff=False
)应该只获取get请求的JSON响应,如:
他应该而不是(!)查看可浏览的api。这适用于根视图和所有端点

为了进行配置,我应用了以下内容:

#settings.py
REST_框架={
“默认\u身份验证\u类”:[“rest\u framework.AUTHENTICATION.SessionAuthentication'],
“默认\u权限\u类”:[“rest\u framework.permissions.IsAuthenticated”],
}
我的端点如下(为了保持示例的简单性,我只显示了1):

#api/url.py
从django.url导入包括,路径
从rest_框架导入路由器
从…起导入视图
应用程序名称='api'
路由器=路由器。DefaultRouter()#可浏览api
router.register('segments',View.SegmentViewSet)
#还有很多。。。
URL模式=[
路径(“”,包括(router.url)),
]
根据回答我的
设置。py
如下所示:

#settings.py
REST_框架={
“默认\u身份验证\u类”:[“rest\u framework.AUTHENTICATION.SessionAuthentication'],
“默认\u权限\u类”:[“rest\u framework.permissions.IsAuthenticated”],
#默认情况下启用JSON呈现程序
“默认渲染器类”:[
'rest_framework.renderers.JSONRenderer',
],
}
我的
api/views.py

#api/views.py
从django_过滤器导入rest_框架作为drf_过滤器
从rest_框架导入过滤器、渲染器、视图集
从…起导入序列化程序
从段。模型导入段
StaffBrowsableAPIMixin类:
def get_渲染器(自身):
"""
如果用户是staff,则添加BrowsableapInderer(普通用户请参阅JSONRenderer响应)
"""
#显式地将renderer设置为JSONRenderer(非工作人员用户的默认设置)
rends=[renderers.JSONRenderer]
如果self.request.user.is\u员工:
#员工用户可以看到可浏览的API
rends.append(renders.browsableappender)
返回[渲染器(),用于渲染器的格式副本]
类分段视图集(StaffBrowsableAPIMixin,viewsets.ReadOnlyModelViewSet):
queryset=Segment.objects.all()
serializer\u class=serializers.SegmentSerializer
这适用于所有端点(当普通用户通过GET调用端点时,他们只看到JSON,而不是可浏览的API)。不幸的是,它不适用于
APIRootView
(例如,api的根视图)

如何使此功能也适用于
APIRootView

Edit 更好地理解您的问题(我相信),您可以非常简单地锁定API的基本URL(mixin可能应该移动到另一个文件,但为了清晰起见,只需将所有内容放在一起):

#api/url.py
从django.url导入包括,路径
从rest_框架导入权限、渲染器、路由器
从…起导入视图
应用程序名称='api'
StaffBrowsableAPIMixin类:
def get_渲染器(自身):
"""
如果用户是staff,则添加BrowsableapInderer(普通用户请参阅JSONRenderer响应)
"""
#显式地将renderer设置为JSONRenderer(非工作人员用户的默认设置)
rends=[renderers.JSONRenderer]
如果self.request.user.is\u员工:
#员工用户可以看到可浏览的API
rends.append(renders.browsableappender)
返回[渲染器(),用于渲染器的格式副本]
类CustomAPIRootView(StaffBrowsableAPIMixin,routers.APIRootView):
权限\类=(permissions.isadmin用户,)
类CustomDefaultRouter(routers.DefaultRouter):
APIRootView=自定义APIRootView
路由器=CustomDefaultRouter()#可浏览api
router.register('segments',View.SegmentViewSet)
#还有很多。。。
URL模式=[
路径(“”,包括(router.url)),
]
权限\u类
将处理不向非管理员用户显示任何端点的问题,但仍将显示可浏览的API模板。要删除该选项,还需要使用
staffbrowsableappimixin
更改渲染器


原始答案 一种方法是使用DRF的渲染器设置和方法

设置.py中:

REST\u框架={
#默认情况下仅启用JSON呈现程序。
“默认渲染器类”:[
'rest_framework.renderers.JSONRenderer',
],
}
在您的
视图.py中:

从rest\u框架导入泛型、渲染器
类StaffBrowsableMixin(对象):
def get_渲染器(自身):
"""
如果用户是员工,则添加可浏览的API呈现程序。
"""
rends=self.u类
如果self.request.user和self.request.user.is\u员工:
rends.append(renders.browsableappender)
返回[渲染器(),用于渲染器的格式副本]
类CustomListApiView(StaffBrowsableMixin,泛型.ListAPIView):
"""
列表视图。
"""
#这里是普通的东西
基本上,对于希望为员工启用BrowsableAPI的任何
APIView
都可以使用
StaffBrowsableMixin


类似的问题,如上面评论中的链接,我的答案也是:

你得到了什么结果?你能检查一下你登录的用户的属性设置为true或false吗?检查一下这篇文章谢谢!正是我想要的。错过了这篇文章。很高兴为您提供帮助:)您还知道如何将此应用于APIRootView吗?@udo您可以更新您的问题,以包括您的
url.py
,以及您如何尝试使用您上面编写的自定义
APIRootView
?然后我可以更新我的答案(希望)以满足你的需要