如何解决从 django 后端获取数据,其中部分动态 URL 是私有的
假设我正在开发一个通过令牌和基本身份验证保护的 django REST api。这个想法是列出果汁。所以我有一个网址,列出了特定品牌的所有果汁。
所以我得到了一个动态网址,如:path("juices/<str:name_brand>/" ...)
我现在想做的是在不需要身份验证的前端显示品牌可口可乐的所有果汁。所以所有访问者都应该看到可口可乐的果汁清单。
我需要使用 JS fetch,因为它必须是异步的。因此我的代码是这样的:
async function get_juices() {
let juices = await fetch(
`${hostname}/api/v1/juices/coca-cola/
)
result = await juices.json();
return juices;
}
我的后端是一个简单的 ListView,可按品牌动态过滤。
但我现在的问题是 API 是私有的,出于明显的安全原因,我无法在前端使用我的凭据。因为任何用户都可以读取前端代码并使用我的凭据访问其他品牌的果汁。
我现在在一些帖子中读到,可能有一个代理服务器,它只接受来自特定客户端的请求,并使用保存在代理服务器上的凭据重新路由请求。但我不知道如何用我的 django 应用程序实现这一点。
我想知道是否有更简单、更快捷的解决方案来访问公共模式下的某些动态 URL 和私有模式下的其他动态 URL?
或者任何提示我如何实现反向代理来实现我需要的?
非常感谢
编辑:
我的观点:
class JuicesList(APIView):
def get(self,request,**url_params):
name_brand = url_params.get("name_brand",None)
result = Juices.objects.filter(name_brand=name_brand)
return Response(result)
默认权限类是“SessionAuthentication”和“TokenAuthentication”
解决方法
您可以在视图中使用简单的 if-else 并返回有关用户和品牌名称的适当响应:
from rest_framework import status
class JuicesList(APIView):
def get(self,request,**url_params):
name_brand = url_params.get("name_brand",None)
if not request.user.is_staff and name_brand != 'coca-cola':
return Response({'Error': 'Permission denied'},status=status.HTTP_403_FORBIDDEN)
result = Juices.objects.filter(name_brand=name_brand)
return Response(result) # This not look correct? You haven't serialized the queryset?
更进一步,这种类型的权限有点手动并且不是很枯燥(不要重复自己),因此您可以使用 permissions DRF docs:
from rest_framework import permissions
class JuicesPermission(permissions.BasePermission):
def has_permission(self,view):
return request.user.is_staff or view.kwargs.get("name_brand",None) == 'coca-cola'
class JuicesList(APIView):
permission_classes = [JuicesPermission]
def get(self,None)
result = Juices.objects.filter(name_brand=name_brand)
return Response(result)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。