从反映表单传递CSRF令牌/验证POST请求到Django-Rest-Framework

时间:2018-04-09 09:16:34

标签: django reactjs django-rest-framework

我正在尝试通过Django-Rest-Framework API从React中构建的表单发布数据,并且遇到了身份验证问题。如果我关闭API视图上的身份验证,我可以发布罚款,所以我认为我已经将其缩小到如何在表单中传递数据。

我的DRF视图如下所示:

class PropertyListCreate(generics.ListCreateAPIView):
    authentication_classes = (SessionAuthentication,)
    permission_classes = (IsAuthenticated,)

    queryset = models.Property.objects.all()
    serializer_class = serializers.PropertySerializer

提交的处理程序在下面。

handleSubmit = e => {
    e.preventDefault();
    const { name, type, address, city, state, zip_code } = this.state;
    const property = { name, type, address, city, state, zip_code };
    const conf = {
        credentials: 'include',
        method: 'POST',
        body: JSON.stringify(property),
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'X-CSRFToken': cookie.load('csrftoken')
         }
    };
    fetch(this.props.endpoint, conf).then(response =>
        console.log(response),
        console.log(conf)
        );
};

当我尝试使用上面的代码发布时,我得到400错误 - 如果我删除'X-CSRFToken':cookie.load('csrftoken'),我得到403错误(禁止)。我对400错误的理解是请求格式错误,所以我认为我正在错误地发送csrf令牌?

这是console.log(响应)的输出:

Response {type: "basic", url: "http://127.0.0.1:8000/api/properties/", 
redirected: false, status: 400, ok: false, …}

从标题中删除X-CSRFToken后的响应:

Response {type: "basic", url: "http://127.0.0.1:8000/api/properties/", 
redirected: false, status: 403, ok: false, …}

0 个答案:

没有答案