在没有 csrf 令牌的情况下对 django 的 curl 请求
curl request on django working without csrf token
我在 Heroku 上有一个 django 项目 运行,使用 Django REST 框架
我使用以下中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
这是我基于 class 的观点之一:
class CommunityMemberView(APIView):
permissions_classes = [IsAuthenticated, ]
serializer_class = CommunitySerializer
def post(self, request, community_id=None):
"""
add the member identified by 'id'
to the community 'community_id', if it exists.
"""
data = request.data
id = data.get('id')
account = Account.objects.get(id=id)
community = Community.objects.get(id=community_id)
community.add_member(account)
serializer = self.serializer_class(community, context={'request': request})
return Response(serializer.data, status=status.HTTP_201_CREATED)
当我尝试使用 curl 执行 POST 请求时,在没有任何 csrf 令牌的情况下,它工作正常,但我不知道为什么。我不使用任何装饰器,但如果我正确理解 django 文档,则不需要。
curl -v -H "content:application/json" -X POST -H "Content-Type:application/json" -d '{"id":"3"}' https://www.example.com/api/v1/community/2/member/ | python -m json.tool
我猜有一个明显的原因,但我在 django 文档和 Stack Overflow 上都找不到它,之前所有关于相关主题的问题都是关于为什么它不起作用,而不是相反。
谢谢
我假设您使用的是 django-rest-framework
?
DRF 视图使用 @csrf_excempt
装饰器包装,除非您使用 SessionAuthentication
参见 http://www.django-rest-framework.org/topics/ajax-csrf-cors/
我在 Heroku 上有一个 django 项目 运行,使用 Django REST 框架 我使用以下中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
这是我基于 class 的观点之一:
class CommunityMemberView(APIView):
permissions_classes = [IsAuthenticated, ]
serializer_class = CommunitySerializer
def post(self, request, community_id=None):
"""
add the member identified by 'id'
to the community 'community_id', if it exists.
"""
data = request.data
id = data.get('id')
account = Account.objects.get(id=id)
community = Community.objects.get(id=community_id)
community.add_member(account)
serializer = self.serializer_class(community, context={'request': request})
return Response(serializer.data, status=status.HTTP_201_CREATED)
当我尝试使用 curl 执行 POST 请求时,在没有任何 csrf 令牌的情况下,它工作正常,但我不知道为什么。我不使用任何装饰器,但如果我正确理解 django 文档,则不需要。
curl -v -H "content:application/json" -X POST -H "Content-Type:application/json" -d '{"id":"3"}' https://www.example.com/api/v1/community/2/member/ | python -m json.tool
我猜有一个明显的原因,但我在 django 文档和 Stack Overflow 上都找不到它,之前所有关于相关主题的问题都是关于为什么它不起作用,而不是相反。
谢谢
我假设您使用的是 django-rest-framework
?
DRF 视图使用 @csrf_excempt
装饰器包装,除非您使用 SessionAuthentication
参见 http://www.django-rest-framework.org/topics/ajax-csrf-cors/