我正在使用Django Rest的可浏览API使用会话身份验证进行POST,并且即使提供了CSRF令牌也没有。我正在寻求关于配置我的ModelViewSet
子类的建议,以便它可以工作。Django DRF CSRF令牌丢失 - DRF删除了request.POST数据?
这里是我的视图集:
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
这个终点,我得到一个403的消息CSRF token missing or incorrect
。
当我在the constructor to rest_framework.request.Request设置断点,我可以看到,在传递的请求包含所需csrfmiddleware
令牌:
在Django中休息的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', '')
什么我可以检查吗?这里有什么可能的错误来源?
考虑
- 在禁用CSRF
- 没有兴趣使用令牌认证
- 很熟悉如何使用CSRF令牌和Django文档他们不感兴趣
- 很熟悉w ^第i个Django REST's docs on CSRF tokens
- 这是内置Django的REST API可浏览;在UI
EDIT 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',
)
EDIT 2 - 软件 版本 - djangorestframework == 3.3.3 - Django的== 1.9。8
编辑3 - 在Git项目可能相关问题
- 'request.data' empty when multipart form data POST in 3.3.x 3814
- Request.data empty when multipart/form-data POSTed 3951
编辑4 - 可能与堆栈溢出职位
- Having a POST'able API and Django's CSRF Middleware
- How to make a POST simple JSON using Django REST Framework? CSRF token missing or incorrect
- How to make a Django-Rest-Framework API that takes POST data?
- Django Rest Framework, ajax POST works but PATCH throws CSRF Failed: CSRF token missing or incorrect
- http://www.django-rest-framework.org/api-guide/parsers/#formparser
这很奇怪。你的中间件设置是什么?也许在那里失踪了。 – Linovia
@Linovia,我不认为是这样,因为我已经验证CSRF cookie是正确发送的。无论如何,请看看2017-03-06编辑。 –
你是否可以用邮递员或卷发来做请求?您是否以任何方式定制了视图集?另外,你为什么使用全部三个解析器? –