我正在使用Django Rest的可浏览API发布使用会话身份验证的帖子,并丢失CSRF令牌,即使它是提供的。我正在寻求关于如何配置我的ModelViewSet子类的建议,这样就可以工作了。
这是我的观点集:
class TreeAPI(ModelViewSet):
authentication_classes = (SessionAuthentication,)
queryset = Tree.objects.get_roots()
parser_classes = (JSONParser, FormParser, MultiPartParser)
permission_classes = (IsAdminUser,)
throttle_classes = (TreeThrottle,)
serializer_class = TreeSerializer我能够使用DRF可浏览的API来GET这个端点,但是当我将它用于这个端点的POST时,我得到了一个带有消息CSRF token missing or incorrect的403。
在framework.request.Request中设置断点时,可以看到传入的请求包含所需的csrfmiddleware令牌:

在Django Rest的Request类中,POST实际上是一个属性:
@property
def POST(self):
if not _hasattr(self, '_data'):
self._load_data_and_files()
if is_form_media_type(self.content_type):
# self.data is an empty QueryDict!
return self.data
return QueryDict('', encoding=self._request._encoding)request.POST不再包含csrfmiddlewaretoken键;它去除了与表单一起提供的所有键:

因此,传递给rest_framework.authentication.SessionAuthentication.enforce_csrf(request) (然后传递给django.middleware.csrf.CsrfViewMiddleware.process_view )的参数找不到csrfmiddlewaretoken令牌:
if request.method == "POST":
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')我能查到什么?这里可能的错误来源是什么?
Considerations
编辑1-中间件
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)编辑2版本的软件- djangorestframework==3.3.3 - Django==1.9.8
编辑3-可能是git项目中的相关问题
编辑4-可能相关的堆栈溢出帖子
发布于 2017-03-06 19:01:46
此问题在djangorestframework==3.5.4中不明显。参见http://www.django-rest-framework.org/topics/release-notes/;我有一种感觉,这是在3.3.x之后修复的。
https://stackoverflow.com/questions/42588447
复制相似问题