You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST私有动态URL接口如何实现特定品牌果汁列表公开访问

解决方案

以下两种是成本最低、实现最快的方案,完全不需要额外搭建代理服务:

方案一:动态权限控制(最快捷,无额外接口改造)

自定义权限类,根据URL里的品牌参数动态判断访问权限,可口可乐品牌直接放行,其余品牌走原有身份校验规则:

  1. 新增自定义权限类
from rest_framework.permissions import BasePermission

class IsPublicBrandOrAuthenticated(BasePermission):
    def has_permission(self, request, view):
        name_brand = view.kwargs.get("name_brand")
        # 可口可乐品牌的请求直接允许匿名访问
        if name_brand == "coca-cola":
            return True
        # 其余品牌需校验身份
        return request.user and request.user.is_authenticated
  1. 替换原有视图的权限配置
class JuicesList(APIView):
    # 替换原来的默认权限类
    permission_classes = [IsPublicBrandOrAuthenticated]
    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)

修改后原有JS代码无需改动,直接请求/api/v1/juices/coca-cola/即可,不需要携带任何身份凭证,其余品牌的接口仍然保持原有认证规则。

方案二:独立公开接口(隔离性更强,避免逻辑耦合)

如果不想修改原有私有接口的逻辑,可以单独新增一个固定的公开接口,专门返回可口可乐品牌的果汁数据:

  1. 新增URL路由
path("public/juices/coca-cola/", views.PublicCocaJuicesList.as_view())
  1. 新增公开视图
from rest_framework.permissions import AllowAny

class PublicCocaJuicesList(APIView):
    # 允许所有用户访问
    permission_classes = [AllowAny]
    def get(self, request):
        result = Juices.objects.filter(name_brand="coca-cola")
        return Response(result)

前端把fetch请求的地址改为对应公开接口路径即可,和原有私有接口完全隔离,安全性更高。

反向代理方案说明

如果确实需要用反向代理实现,无需额外搭建服务,直接用Nginx配置即可:配置一个固定路径只转发可口可乐品牌的请求,在Nginx配置里硬编码写入认证头,其余路径禁止转发。但该方案需要维护Nginx配置、存储身份凭证,实现成本远高于上面两种直接改Django代码的方案,不推荐使用。

内容的提问来源于stack exchange,提问作者shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 03:06:03