api rest 调用更新 django 模型时出现错误 415

Posted

技术标签:

【中文标题】api rest 调用更新 django 模型时出现错误 415【英文标题】:Error 415 when api rest call to update a django model 【发布时间】:2019-05-27 13:12:14 【问题描述】:

我正在使用 djangorestframework、django 2.1.4 和 python 3.6+ 我有一个简单的模型,我试图通过使用requests 的脚本添加它。即使我通过 json 格式传递数据,它也会给我一个 415 错误。我需要做什么来修复它?

models.py

class Card(models.Model):
    id           = models.CharField(max_length=36, blank=False, primary_key=True)
    card_title   = models.CharField(max_length=100, blank=False)

序列化器.py

from rest_framework import serializers
class CardSerializer(serializers.ModelSerializer):
    class Meta:
        model = Card
        fields = ('id', 'card_title',)

views.py

from cards.models import Card
from cards.serializers import CardSerializer
from rest_framework import generics
from rest_framework import permissions

class CardList(generics.ListCreateAPIView):
    permission_classes = ()

    queryset = Card.objects.all()
    serializer_class = CardSerializer


class CardDetail(generics.RetrieveUpdateDestroyAPIView):
    permisssion_classes = () # set the permission class

    queryset = Card.objects.all()
    serializer_class = CardSerializer

urls.py

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from cards import views

urlpatterns = [
    path('cards/', views.CardList.as_view()),
    path('cards/<int:pk>/', views.CardDetail.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

最后,这是我用来更新它的脚本

import json
import requests # http requests 
BASE_URL = "http://127.0.0.1:8000/"    
ENDPOINT = "cards/"   

def create_update():
    new_data = 
        'id': 3,
        "card_title": "AA"  
    
    r = requests.post(BASE_URL + ENDPOINT, data=json.dumps(new_data))
    print(r.headers)
    if r.status_code == requests.codes.ok:
        return r.json()
    return r.text

create_update()

有趣的是,我可以在脚本中使用new_data,然后通过媒体类型为 application/json 的原始数据部分下的 djangorestframework 工具发布它。

这是请求标头 -

'Date': 'Sun, 30 Dec 2018 17:53:33 GMT', 'Server': 'WSGIServer/0.2 CPython/3.6.6', 'Content-Type': 'application/json', 'Vary': 'Accept, Cookie', 'Allow': 'GET, POST, HEAD, OPTIONS', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Length': '62'

这里发生了什么?

【问题讨论】:

Http 415 Unsupported Media type error with JSON的可能重复 我看到了,但那是在 javascript 中,所以我知道那里发生了什么。 【参考方案1】:

在我正在运行的脚本中,我有代码data=json.dumps(new_data)。需要改为data=new_data。然后完美运行。

【讨论】:

以上是关于api rest 调用更新 django 模型时出现错误 415的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-swagger对API接口注释

通过 Django REST POST 更新模型实例

如何修复在 Django Rest Framework 中使用 REST API 登录时出现的 CSRF 错误?

使用 Axios 从前端访问 Django Rest API 时出现 Cors 错误

如何在使用 AJAX、Django REST API 和 jQuery 以模式形式更新记录时显示外键字段名称而不是 ID

使用 Rest API 编写复杂查询的 Django ORM