Skip to main content
 首页 » 编程设计

python之Django rest 基本身份验证问题(HTTP 400)

2025年05月04日50haluo1

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

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

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

这是 View 集:

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 下载了准确的源代码。我创建了一个 super 用户并且发生了完全相同的事情,出于某种原因 django rest browsable api 或我的浏览器没有正确发送发布数据。

编辑 3 由于某种原因,我可以将 rest-framework 降级到版本 3.2.5。我不是唯一遇到此问题的人:Django Rest Framework - Browsable API Form always returns 400 bad request

请您参考如下方法:

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

但是,我还不能重现。欢迎提供帮助以了解发生了什么。

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

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