【问题标题】:Body not Posting in Django Rest API call using Javascript fetch正文未在使用 Javascript 提取的 Django Rest API 调用中发布
【发布时间】:2020-12-05 16:39:41
【问题描述】:

我在我的 Node.js 应用程序中使用 Django RestFramework API。 我正在使用 Javascript 获取 API 将一些数据发送到我在 Django 中配置的项目的后端。 但是数据没有发布。它在 PostMan 中运行良好,但不使用 fetch。

我的API类如下:

class ProfileList(APIView):

    def get(self, request):
        ProfileObjects = Profile.objects.all()
        serializer = ProfileSerializer(ProfileObjects, many=True)
        return Response(serializer.data)

    def post(self, request, **kwargs):
        print(request.POST)
        print(self.request.POST)
        ProfileObjects = Profile.objects.all()
        serializer = ProfileSerializer(ProfileObjects, many=True)
        return Response(serializer.data)

fetch 调用如下所示..:

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var csrftoken = getCookie('csrftoken');

fetch('http://127.0.0.1:8000/API/', {
    method: 'post',
    headers: {
        'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/json',
        'X-CSRFToken': csrftoken,
    },
    body: JSON.stringify({data: "your data"})
}).then(res => res.json())
    .then(res => console.log(res));

根据 API 类视图,它应该打印 {data: "your data"},但事实并非如此。 相反,这是在使用 fetch 调用时打印出来的

<QueryDict: {}>
<QueryDict: {}>
HTTP POST /API/ 200 [0.01, 127.0.0.1:62136]

当我将它与邮递员一起使用时,它会被打印出来..

<QueryDict: {'data': ['your data']}>
<QueryDict: {'data': ['your data']}>
HTTP POST /API/ 200 [0.01, 127.0.0.1:62358]

【问题讨论】:

    标签: javascript python django django-rest-framework fetch


    【解决方案1】:

    csrftoken 标头应为 X-CSRFToken,如下所示 -

    headers: {'X-CSRFToken': csrftoken}
    

    试试这个检查一下,你可以看到文档here

    为了解析请求,在 DRF 中我们应该使用 request.data 而不是 request.POST

    检查 DRF 中的请求解析here

    【讨论】:

    • 浏览器控制台是否出现异常?
    • 不,我在控制台上没有收到任何异常。我从 API 视图返回的东西会完美地在控制台上注销。唯一的问题是我从 fetch 的正文部分发送的数据没有进入后端。休息一切正常......同样的事情在邮递员中也能完美运行
    • 哦,我想是因为您使用的是request.POST,它应该是request.data
    • 是的,这是错误...我已经为未来的用户更正了 API 类。
    【解决方案2】:
    class ProfileList(APIView):
    
        def get(self, request):
            ProfileObjects = Profile.objects.all()
            serializer = ProfileSerializer(ProfileObjects, many=True)
            return Response(serializer.data)
    
        def post(self, request, **kwargs):
            print(request.POST) // will not work
            print(request.data) // will work
            ProfileObjects = Profile.objects.all()
            serializer = ProfileSerializer(ProfileObjects, many=True)
            return Response(serializer.data)
    

    主要问题是我使用 request.POST 而不是 request.data 访问正文

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2021-04-11
      • 2019-04-27
      • 2017-10-13
      • 1970-01-01
      相关资源
      最近更新 更多