1

我正在构建一个启用了基本身份验证的 API。当我尝试使用可浏览的 api 将实例添加到数据库(在具有 AllowAny 设置的视图集上)时。这在我没有登录时有效。但是,当我没有登录时,它会给我一个错误:

HTTP 400 错误请求内容类型:application/json 变化:接受允许:POST、OPTIONS

{
    "product": [
        "This field is required."
    ],
    "buyername": [
        "This field is required."
    ],
    "buyeremail": [
        "This field is required."
    ]
}

这是视图集:

class TicketBuyerViewSet(mixins.CreateModelMixin,  
                   viewsets.GenericViewSet):
    queryset = Ticket.objects.all()
    serializer_class = TicketSerializer
    permission_classes = (IsOwnerOrReadOnly,permissions.AllowAny)

    def perform_create(self, serializer):
        serializer.save(isPayed=False,checkedIn=False,isRefunded=False,checkedInDate=None,paymentID="",paymentDate=None)

这是我的 urls.py 文件:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('events.urls')),
    url(r'^docs/', include('rest_framework_swagger.urls')),
]

urlpatterns += [
    url(r'^api-auth/', include('rest_framework.urls',
                               namespace='rest_framework')),
]

我最近才遇到这个问题。我从 django 文档中制作了片段应用程序,该应用程序完美运行了大约一周。但是,自从几天以来,我对这个 api 和我自己的 api 有同样的问题。我也尝试过chrome和firefox。

编辑:虽然我明白为什么 http 错误代码可能与我的问题相反,但我高度怀疑错误在于 django-rest 身份验证,因为当我注销并填写完全相同的数据时,它确实有效。以下是我分别登录和注销时 PUT 请求的响应错误代码:

[03/Nov/2015 20:38:44] "POST /ticketsbuyer/ HTTP/1.1" 400 10513
[03/Nov/2015 20:39:24] "POST /ticketsbuyer/ HTTP/1.1" 201 4543

编辑 2:我从 django-rest-framework-tutorial github 下载了确切的源代码。我创建了一个超级用户并且发生了完全相同的事情,由于某种原因 django rest browsable api 或者我的浏览器没有正确发送帖子数据。

编辑 3出于某种原因,我降级到其余框架的 3.2.5 版本对我有用。我不是唯一一个遇到这个问题的人:Django Rest Framework - Browsable API Form always return 400 bad request

4

2 回答 2

3

有一个关于此的已打开错误:https ://github.com/tomchristie/django-rest-framework/issues/3588

但是,我还无法重现。欢迎帮助以了解发生了什么。

编辑:谢谢,看来身份验证确实是这个错误的关键。

编辑:升级到 3.3.1 应该可以解决问题。

于 2015-11-04T09:44:59.843 回答
2

HTTP400通常不是身份验证错误。通常是数据错误。它发回的消息说您没有发送必填字段,因此请检查您发送的数据并确保它满足所有必填字段。如果这是一个身份验证问题,它将返回一个HTTP401

于 2015-11-03T19:59:25.943 回答