Javascript 从django后端获取部分动态URL私有数据

Javascript 从django后端获取部分动态URL私有数据,javascript,django,authentication,django-rest-framework,Javascript,Django,Authentication,Django Rest Framework,假设我正在开发一个django REST api,它通过令牌和基本身份验证进行保护。这个想法是列出果汁。因此,我有一个网址,列出了所有果汁从特定品牌 所以我得到了一个动态URL,比如:path(“果汁//”…) 我现在想做的是在我的前端展示可口可乐品牌的所有果汁,不需要认证。所以所有参观者都应该看到可口可乐果汁的清单 我需要使用JSFETCH,因为它必须是异步的。因此,我的代码类似于: async function get_juices() { let juices = await fetc

假设我正在开发一个django REST api,它通过令牌和基本身份验证进行保护。这个想法是列出果汁。因此,我有一个网址,列出了所有果汁从特定品牌

所以我得到了一个动态URL,比如:
path(“果汁//”…)

我现在想做的是在我的前端展示可口可乐品牌的所有果汁,不需要认证。所以所有参观者都应该看到可口可乐果汁的清单

我需要使用JSFETCH,因为它必须是异步的。因此,我的代码类似于:

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?
进一步说,这种类型的权限有点手动,不太枯燥(不要重复),因此您可以使用:


您可以在视图中使用简单的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?
进一步说,这种类型的权限有点手动,不太枯燥(不要重复),因此您可以使用:


是否要根据发出请求的用户筛选/显示对象?您可以使用DRF中的权限来执行此操作。请展示您的观点。我希望我自己的网站能够在未经身份验证的情况下从
/api/v1/juices/coca-cola/
获取所有果汁,但我希望所有其他URL都是私有的(
/api/v1/juices/pepsi/
应该是私有的)或重新措辞:我希望向所有访问者显示
/api/v1/juices/coca-cola/
的数据。但我只希望经过身份验证的员工用户能够访问
/api/v1/juices/pepsi/
,最后让我补充一点:我不希望任何人打开开发人员工具,阅读请求,调整请求,获取其他不允许访问的数据。你想根据发出请求的用户筛选/显示对象吗?您可以使用DRF中的权限来执行此操作。请展示您的观点。我希望我自己的网站能够在未经身份验证的情况下从
/api/v1/juices/coca-cola/
获取所有果汁,但我希望所有其他URL都是私有的(
/api/v1/juices/pepsi/
应该是私有的)或重新措辞:我希望向所有访问者显示
/api/v1/juices/coca-cola/
的数据。但我只希望经过身份验证的员工用户能够访问
/api/v1/juices/pepsi/
,最后让我补充一点:我不希望任何人打开开发人员工具,阅读请求,调整请求,获取他们不允许访问的其他数据。这是一个非常好的解决方案,为我节省了不少时间。非常感谢,我真的很感激。简短的后续问题:想象一下,我必须使用许多URL和许多不同的参数来实现这一点。有没有办法告诉django只允许来自特定主机的特定动态URL请求?@shadow是的,应该是可能的,您只需要从相应的http头中获取主机名就可以了,太好了,非常感谢!我想这不会带来重大的安全风险,使用权限处理并获得http主机?@shadow我个人在安全方面没有经验,可能会有一些问题,您需要咨询该领域的专家。好的,我会这样做:)再次感谢,这对我帮助很大。这是一个很好的解决办法,也帮了我不少忙。非常感谢,我真的很感激。简短的后续问题:想象一下,我必须使用许多URL和许多不同的参数来实现这一点。有没有办法告诉django只允许来自特定主机的特定动态URL请求?@shadow是的,应该是可能的,您只需要从相应的http头中获取主机名就可以了,太好了,非常感谢!我想这不会带来重大的安全风险,使用权限处理并获得http主机?@shadow我个人在安全方面没有经验,可能会有一些问题,你需要咨询该领域的专家。好的,我会这样做:)再次感谢你,这对我帮助很大