Django REST在DELETE方法上给出403禁止,但在POST上不允许
我正在尝试使用ajax调用删除一个条目。 当我在Django REST在DELETE方法上给出403禁止,但在POST上不允许,django,django-rest-framework,Django,Django Rest Framework,我正在尝试使用ajax调用删除一个条目。 当我在泛型.DestroyAPIView中使用默认的“delete”方法时,我得到了一个403禁止,但是如果我添加了一个post方法,请立即调用delete方法,并将ajax类型更改为“post”,这样就可以了。有人知道是什么原因造成的吗 请注意,我覆盖了get_object函数,以根据发布的数据获取对象。(可能是因为删除不允许发布数据的方法?如果是,原因是什么?以及如何传递CSRF令牌??) 阿贾克斯: 网址: 视图: 序列化程序: class Pos
泛型.DestroyAPIView
中使用默认的“delete”方法时,我得到了一个403禁止,但是如果我添加了一个post方法,请立即调用delete方法,并将ajax类型更改为“post”,这样就可以了。有人知道是什么原因造成的吗
请注意,我覆盖了get_object函数,以根据发布的数据获取对象。(可能是因为删除不允许发布数据的方法?如果是,原因是什么?以及如何传递CSRF令牌??)
阿贾克斯:
网址:
视图:
序列化程序:
class PostDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Post_Detail
fields = ['name', 'value']
403禁止的错误代码会以某种方式表明权限被拒绝或您未经身份验证 “DestroyAPIView”用于仅删除单个模型实例的API端点 你有完整的回溯,你可以附加到你的问题 文档引用
我得到的唯一错误是控制台:“禁止:/my/api/path/”和chrome控制台:“状态代码:403禁止”。请注意,我可以通过Django REST可浏览API自由删除条目,因此我的权限很好,而且似乎我也正确配置了API视图(因为它在可浏览API中工作正常)。问题始于我对同一API进行ajax调用。再一次如果我将类型从“DELETE”更改为“POST”,并将视图的POST函数更改为只调用DELETE函数;那么我的ajax调用就可以正常工作了。好吧,看看你的url.py文件,你的url似乎不是针对一个细节视图。详细视图通常由ID/PK(主键)、slug或UUID字段标识。最后,似乎有一个额外的右大括号。我没有在url中包含pk/id,因为要删除的对象由
值
、名称
(在ajax调用的“数据”属性中提供)和当前用户的唯一组合标识。这三种方法的结合将要删除的对象缩小为单个对象(这是通过视图中的“get_object”方法完成的)。哦,ajax调用中的额外括号是复制/粘贴错误,因为ajax调用在我的代码中的函数内,我无意中包含了javascript函数的右括号(为了使它更简单,我没有将其包含在代码片段中)。不过观察得很好:)谢谢。你还有其他建议吗?请注意,如果我简单地将类型更改为post
,而不是delete
,代码工作正常,因此逻辑似乎是正确的。
path('post_details/delete/', PostDetailDeleteApiView.as_view(), name='post_details_delete'),
class PostDetailDeleteApiView(generics.DestroyAPIView):
serializer_class = PostDetailSerializer
# the code below allows it to work if uncommented and type in ajax changed to 'post'
# def post(self, request, *args, **kwargs):
# return self.delete(request, *args, **kwargs)
def get_object(self):
"""
Returns the post detail object to be deleted based on the name:value pair
provided by the ajax call.
"""
data = self.request.data
obj = Post_Detail.objects.filter(
name=data.get('name', ''), value=data.get('value', '')
).filter(
post__account__user=self.request.user
)
if obj.exists():
return obj.get()
else:
raise Http404
class PostDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Post_Detail
fields = ['name', 'value']