Django Rest Framework 正在检测 PUT 请求上的 AnonymousUser
Django Rest Framework is detecting AnonymousUser on PUT requests
我有这个观点
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)
我用它来确定问题的根源。
urls.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'
打印语句分别为 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
所以我有理由相信,当我发出 get 请求时,会检测到经过身份验证的用户,但是对于 PUT,它会突然变成匿名的。我怀疑我必须进行前端身份验证吗?例如,在请求中的 headers 中使用令牌进行授权。因为我的 GET 请求运行良好。
编辑:
添加 SellerViewSet:
class SellerViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = Seller.objects.all()
serializer_class = SellerSerializer
DRF 身份验证方案使用 Django 的默认 session 后端进行身份验证,如果您使用 AJAX 样式 API 和 SessionAuthentication
,您需要确保为任何 "unsafe" HTTP 方法调用包含有效的 CSRF 令牌,例如 PUT, PATCH, POST or DELETE
requests(DRF docs)
IsAuthenticated
需要 request.user
object 和用户登录 (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)
您需要设置 header X-CSRFToken
以请求 header 以便下一次请求,以便服务器知道您是谁
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
我有这个观点
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)
我用它来确定问题的根源。
urls.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'
打印语句分别为 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
所以我有理由相信,当我发出 get 请求时,会检测到经过身份验证的用户,但是对于 PUT,它会突然变成匿名的。我怀疑我必须进行前端身份验证吗?例如,在请求中的 headers 中使用令牌进行授权。因为我的 GET 请求运行良好。
编辑: 添加 SellerViewSet:
class SellerViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = Seller.objects.all()
serializer_class = SellerSerializer
DRF 身份验证方案使用 Django 的默认 session 后端进行身份验证,如果您使用 AJAX 样式 API 和 SessionAuthentication
,您需要确保为任何 "unsafe" HTTP 方法调用包含有效的 CSRF 令牌,例如 PUT, PATCH, POST or DELETE
requests(DRF docs)
IsAuthenticated
需要 request.user
object 和用户登录 (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)
您需要设置 header X-CSRFToken
以请求 header 以便下一次请求,以便服务器知道您是谁
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