【问题标题】:Fetch : authentication credentials were not provided获取:未提供身份验证凭据
【发布时间】:2022-01-10 05:27:57
【问题描述】:

当我请求这个时,一切正常,我得到了数据:

const get_players = async()=>{
    const response = await fetch('http://127.0.0.1:8000/player_stats/api/players/')
    const data     = await response.json()
    console.log(data)
}    

但是当我将 permission_classes 放入views.py 时,我会在控制台中收到:

{detail: 'Authentication credentials were not provided.}

我是 Javascript 初学者,希望您能理解。
我不知道如何将身份验证凭据放入我的 fech。

Views.py

class PlayersView(ModelViewSet):             
        permission_classes = [IsAuthenticated]
        serializer_class = PlayersSerializer
        queryset         = Players.objects.all()

    def list(self, request):
        queryset   = Players.objects.all()
        serializer = PlayersSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset   = Players.objects.all()
        qs         = get_object_or_404(queryset, pk=pk)
        serializer = PlayersSerializer(qs)
        return Response(serializer.data) 

Urls.py

router = DefaultRouter()
router.register('players',views.PlayersView,basename='players') 

app_name = 'main'
urlpatterns = [    
    path('',include(router.urls)),           
]

有什么想法吗?

【问题讨论】:

  • 您添加了一个约束,即某人需要登录才能使用该 api 端点,您是否尝试过登录?

标签: javascript python django django-rest-framework


【解决方案1】:

需要对运行 fetch 的浏览器背后的用户进行身份验证,即。登录。有多种方法可以做到这一点。参考:

https://www.django-rest-framework.org/api-guide/authentication/

但基本上,SessionAuthentication 将使用 Django 的用户登录系统,如果你想在不登录的情况下访问 API,你可以使用 TokenAuthentication 在这种情况下,你需要在你的 fetch 请求中添加一个 HTTP 头。

const get_players = async() =>{
    const response = await fetch('http://127.0.0.1:8000/player_stats/api/players/', {
      headers: {
        'Authorization': `Token ${apiToken}`
      }
    })
    const data = await response.json()
    console.log(data)
}

【讨论】:

    【解决方案2】:

    您的视图类告诉我们,除非用户经过身份验证(登录),否则您无法访问此页面,我建议您使用 django 默认身份验证(会话身份验证)获取存储在本地存储中的 cookie,如下所示:@ 987654322@ 然后设置会话ID: localStorage.setItem('session_id',res.data.session_id)(这只是一个虚拟示例,我不知道您如何在后端设置会话 ID)当您在前端收到响应时,或者如果您使用令牌身份验证(如 jwt),您应该添加到标题: headers: {'Authorization': Token ${apiToken}} ,用于 drf 并且易于与不同端点一起使用的伟大 jwt 模块之一是 drf-simplejwt,更多信息:https://django-rest-framework-simplejwt.readthedocs.io/en/latest/

    附带说明:我不建议使用 django 默认身份验证,因为它很难处理,尤其是在前端方面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 2020-07-22
      • 2021-11-29
      • 2019-04-26
      • 2020-01-11
      • 2019-07-29
      • 2019-06-11
      • 2019-05-25
      相关资源
      最近更新 更多