首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DRF令牌丢失- DRF删除request.POST数据?

DRF令牌丢失- DRF删除request.POST数据?
EN

Stack Overflow用户
提问于 2017-03-03 21:08:07
回答 1查看 869关注 0票数 0

我正在使用Django Rest的可浏览API发布使用会话身份验证的帖子,并丢失CSRF令牌,即使它是提供的。我正在寻求关于如何配置我的ModelViewSet子类的建议,这样就可以工作了。

这是我的观点集:

代码语言:javascript
复制
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实际上是一个属性:

代码语言:javascript
复制
@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令牌:

代码语言:javascript
复制
        if request.method == "POST":
            request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')

我能查到什么?这里可能的错误来源是什么?

Considerations

  • 不想禁用CSRF
  • 不想使用令牌身份验证
  • 熟悉如何使用CSRF令牌和Django文档
  • 熟悉http://www.django-rest-framework.org/topics/ajax-csrf-cors/
  • 这是内置的Django REST可浏览API;在UI中没有修改任何内容。

编辑1-中间件

代码语言:javascript
复制
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-可能相关的堆栈溢出帖子

EN

回答 1

Stack Overflow用户

发布于 2017-03-06 19:01:46

此问题在djangorestframework==3.5.4中不明显。参见http://www.django-rest-framework.org/topics/release-notes/;我有一种感觉,这是在3.3.x之后修复的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42588447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档