如何仅显示用户有权访问的可浏览网站 API 中的网址?
How display only the urls in my browsable Web API, which the user has permission?
我正在使用 Python 3.4、Django 1.8.4 和 DjangoRestFramework 3.2.2
默认情况下,django rest 框架显示所有可用的 url,如果此人试图访问任何没有权限的 url,它会显示不允许的错误
"detail": "You do not have permission to perform this action."
从我在class DefaultRouter中看到的,它只加载了一次,当我上服务器时,
我注意到在 rest_framework/routers.py 的 283 行,有一个硬编码字段。
class APIRoot (views.APIView):
_ignore_model_permissions = True
我已更改为 False,但什么也没发生 所有 url 都已加载。
我试图了解 Custom Router 的工作原理,但无法解决我的问题。
任何人都知道是否有任何方法可以在我的可浏览网站 API 中仅显示 url,用户有权限?
已修复。我覆盖了 django-rest-framework 的 DefaultRouter class。
现在,如果用户没有列出对象的权限,url 不会出现。
class UrlRouter(DefaultRouter):
def get_api_root_view(self):
"""
Return a view to use as the API root.
"""
api_root_dict = OrderedDict()
list_name = self.routes[0].name
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
class APIRoot(views.APIView):
_ignore_model_permissions = True
def get(self, request, *args, **kwargs):
ret = OrderedDict()
namespace = request.resolver_match.namespace
for key, url_name in api_root_dict.items():
if namespace:
if request.user.has_perm(key.split('-')[0]+'_list'):
url_name = namespace + ':' + url_name
try:
from django.conf.urls import url
ret[key] = reverse(
url_name,
args=args,
kwargs=kwargs,
request=request,
format=kwargs.get('format', None)
)
except NoReverseMatch:
# Don't bail out if eg. no list routes exist, only detail routes.
continue
return Response(ret)
return APIRoot.as_view()
我正在使用 Python 3.4、Django 1.8.4 和 DjangoRestFramework 3.2.2
默认情况下,django rest 框架显示所有可用的 url,如果此人试图访问任何没有权限的 url,它会显示不允许的错误
"detail": "You do not have permission to perform this action."
从我在class DefaultRouter中看到的,它只加载了一次,当我上服务器时,
我注意到在 rest_framework/routers.py 的 283 行,有一个硬编码字段。
class APIRoot (views.APIView):
_ignore_model_permissions = True
我已更改为 False,但什么也没发生 所有 url 都已加载。
我试图了解 Custom Router 的工作原理,但无法解决我的问题。
任何人都知道是否有任何方法可以在我的可浏览网站 API 中仅显示 url,用户有权限?
已修复。我覆盖了 django-rest-framework 的 DefaultRouter class。 现在,如果用户没有列出对象的权限,url 不会出现。
class UrlRouter(DefaultRouter):
def get_api_root_view(self):
"""
Return a view to use as the API root.
"""
api_root_dict = OrderedDict()
list_name = self.routes[0].name
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
class APIRoot(views.APIView):
_ignore_model_permissions = True
def get(self, request, *args, **kwargs):
ret = OrderedDict()
namespace = request.resolver_match.namespace
for key, url_name in api_root_dict.items():
if namespace:
if request.user.has_perm(key.split('-')[0]+'_list'):
url_name = namespace + ':' + url_name
try:
from django.conf.urls import url
ret[key] = reverse(
url_name,
args=args,
kwargs=kwargs,
request=request,
format=kwargs.get('format', None)
)
except NoReverseMatch:
# Don't bail out if eg. no list routes exist, only detail routes.
continue
return Response(ret)
return APIRoot.as_view()