【问题标题】:Can't make POST request via fetch javascript to django rest api无法通过 fetch javascript 向 django rest api 发出 POST 请求
【发布时间】:2021-11-28 10:16:04
【问题描述】:

我刚开始学习前端和 javascript。 所以,以前我通过 django rest 框架制作了简单的 api。 现在 - 开始通过 javascript 的 fetch-api 测试它。 GET - 没问题 - 它运作良好。 POST - 我收到一条消息,例如: “415 不支持的媒体类型”。

这是我的简化 html 文件 (tryjs.html),其中包含 fetch POST 请求:

<!DOCTYPE html>
<html>

<head>
</head>

<body>
     <script>
        let myurl2 = "http://127.0.0.1:8000/myfamily/";
        async function myfu() {
            let response = await fetch(myurl2, {
                mode: "no-cors",
                method: 'POST',
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({firstname: "first", secondname: "second"})
            })
        };
        myfu();
    </script>
</body>

</html>

看起来很简单,没什么特别的。

这里 - 来自 drf 的 model.py:

from django.db import models


class Family(models.Model):
    firstname = models.CharField(max_length=20)
    secondname = models.CharField(max_length=20)

    def __str__(self):
        return self.firstname

还有serializers.py:

from rest_framework import serializers
from .models import Family


class FamilySerializer(serializers.ModelSerializer):
    class Meta:
        model = Family
        fields = ('firstname', 'secondname')

并查看:

from rest_framework import viewsets
from .models import Family
from .serializers import FamilySerializer


class FamilyViewSet(viewsets.ModelViewSet):
    queryset = Family.objects.all()
    serializer_class = FamilySerializer

以及应用程序的urls.py(添加到项目的urls.py):

from django.urls import path
from rest_framework.routers import SimpleRouter
from .views import FamilyViewSet
from django.views.generic import TemplateView


router = SimpleRouter()
router.register('', FamilyViewSet, basename="family")

urlpatterns = [
    path('tryjs/', TemplateView.as_view(template_name="tryjs.html")),
]

urlpatterns += router.urls

我通过邮递员进行 GET 和 POST 请求 - 一切正常。 我通过javascript脚本进行GET请求(我已经从上面的代码中删除了这部分) - 它也可以正常工作。 当我尝试通过上面的 js 脚本发出 POST 请求时,我得到了关于错误媒体类型的失败。 请帮忙。我尝试了很多。它是如此简单的案例。但是...它不起作用(

【问题讨论】:

  • 我不了解python,但您似乎正在尝试接受json响应,但响应是由视图引擎生成的html。

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


【解决方案1】:

你得到错误的媒体类型是因为你设置了mode: "no-cors",这使得 Content-Type 标头是不可变的。因此将其设置为"application/json" 将自动转换为"text/plain"。保持mode :"cors",它会起作用。

不需要自己写js代码,你会从邮递员自己那里得到代码。尝试使用它

【讨论】:

  • 是的,你说的“no-cors”是对的。我已经更改了它并且...开始遇到另一个问题,由“错误的 csrf 令牌”引起。似乎我没有任何授权(视图中没有登录等),但是...尝试根据 drf 的建议为每个视图关闭所有视图的 csrf - 不起作用(跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多