0

我有这个视图集

class OrderItemViewSet(viewsets.ModelViewSet):
  serializer_class = OrderItemSerializer

  def get_queryset(self):
    print('Current User', self.request.user, self.action)
    return OrderItem.objects.filter(order__owner=self.request.user.profile)

注意print('Current User', self.request.user)我用它来确定问题的根源。

网址.py

router.register('order_items', shopping_api.OrderItemViewSet, 'order_items')

到目前为止一切顺利......但是当我提出 PUT 请求时;

    const response = await fetch(api.authurl+'/order_items/'+order_item.id+'/', {
      method: 'PUT',
      headers: api.httpHeaders,
      body: JSON.stringify(order_item)
    });

出现此错误

AttributeError: 'AnonymousUser' object has no attribute 'profile'

print 语句分别为 GET 和 POST 请求识别这些:

[19/Jun/2020 21:03:02] "GET /sellers/3/ HTTP/1.1" 200 196
Current User AD list
[19/Jun/2020 21:03:03] "GET /order_items/ HTTP/1.1" 200 1046
Current User AnonymousUser update

所以我有理由相信,当我发出获取请求时,会检测到经过身份验证的用户,但是使用 PUT 时,它突然变成了匿名用户。我怀疑我必须进行前端身份验证吗?例如,在请求的我的标头中使用令牌进行授权。因为我的 GET 请求做得很好。

编辑: 添加 SellerViewSet:

class SellerViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
  queryset = Seller.objects.all()
  serializer_class = SellerSerializer
4

1 回答 1

0

DRF 身份验证方案使用 Django 的默认会话后端进行身份验证,如果您使用 AJAX 风格的 API SessionAuthentication,您需要确保为任何“不安全”的 HTTP 方法调用包含有效的 CSRF 令牌,例如PUT, PATCH, POST or DELETE请求(DRF 文档)

IsAuthenticated需要request.user对象和用户登录(is_authenticated)。

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

您需要将标X-CSRFToken头设置为下一个请求的请求标头,以便服务器知道您是谁

 var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
 xhr.setRequestHeader("X-CSRFToken", csrftoken);

// fetch
 headers:{
  'X-CSRFToken': jQuery("input[name=csrfmiddlewaretoken]").val()
}

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

于 2020-06-19T13:19:00.967 回答