【发布时间】:2016-03-09 22:38:57
【问题描述】:
我正在学习使用 Django Rest Framework 并按照教程进行操作。我根据教程创建了一个简单的索引,它适用于 GET,但不适用于 POST:
@api_view(['GET','POST'])
def game_list(request):
if request.method == 'GET':
games = Game.objects.all()
serializer = GameSerializer(games, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = GameSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我将默认设置设置为AllowAny:
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
但当我尝试使用POST 使用Firefox RESTClient 进行任何操作时,我仍然得到HTTP 403。 I read 我必须添加一个 X-CSRFToken 标头和 cookie 才能正常工作,但我没有这些。
【问题讨论】:
-
“我没有这些”是什么意思?您没有启用 CSRF 保护?你试过
csrf_exempt吗? -
您必须将其与您的发布请求一起传递。当您访问网站中的任何页面时,它存在于会话中,并且可以被视为 cookie。 docs.djangoproject.com/en/1.7/ref/contrib/csrf/#csrf-ajax
-
@ChrisHawkes 我明白了,但我想确切地了解发生了什么。 RESTClient 仅发送我自己放入的标头。我根本没有这方面的会话信息。当我执行干净的
GET时,响应标头中没有任何 cookie 或会话信息。 -
我认为 csrftoken 仅在帖子中是必需的,但是对于像以前的评论者所说的那样进行测试,您可以在您的视图上进行该方法调用,从而免除 csrf
-
@ChrisHawkes 是的,这可能在上一步中起作用;-))。我继续我的教程,
APIView似乎不支持@csrf_exempt注释...
标签: django django-rest-framework