一尘不染

如何使用Django REST Framework使POST简单JSON?CSRF令牌丢失或不正确

django

希望有人向我展示如何使用Django REST框架使用JSON发出简单的POST请求。我在本教程中的任何地方都看不到任何示例吗?

这是我要发布的角色模型对象。这是一个全新的角色,我想添加到数据库中,但出现500错误。

{
    "name": "Manager", 
    "description": "someone who manages"
}

这是我在bash终端提示符下的curl请求:

curl -X POST -H "Content-Type: application/json" -d '[
{
    "name": "Manager", 
    "description": "someone who manages"
}]'
http://localhost:8000/lakesShoreProperties/role

网址

http://localhost:8000/lakesShoreProperties/roles

DOES可以处理GET请求,并且我可以下拉数据库中的所有角色,但是似乎无法创建任何新的Roles。我没有权限设置。我在views.py中使用标准视图

class RoleDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Role.objects.all()
    serializer_class = RoleSerializer
    format = None

class RoleList(generics.ListCreateAPIView): 
        queryset = Role.objects.all()
        serializer_class = RoleSerializer
        format = None

在urls.py此应用程序的我中,相关的url-视图映射是正确的:

url(r'^roles/$', views.RoleList.as_view()),
url(r'^role/(?P<pk>[0-9]+)/$', views.RoleDetail.as_view()),

错误信息是:

{
    "detail": "CSRF Failed: CSRF token missing or incorrect."
}

这是怎么回事,这有什么解决办法?本地主机是跨站点请求吗?我已经添加@csrf_exempt了RoleDetail,RoleList但是似乎并没有改变任何东西。可以将此装饰器添加到类中,还是必须将其添加到方法中?添加@csrf_exempt装饰,我的错误变成:

Request Method: POST
Request URL:    http://127.0.0.1:8000/lakeshoreProperties/roles/
Django Version: 1.5.1
Exception Type: AttributeError
Exception Value:    
'function' object has no attribute 'as_view'

然后我在整个应用程序中禁用了CSRF,现在我收到以下消息:

{“ non_field_errors”:[“ Invalid data”]}当我知道的JSON对象为有效json时。这是一个非字段错误,但是我被困在这里。

好吧,事实证明我的json无效吗?

{
    "name": "admin", 
    "description": "someone who administrates"
}

[
    {
        "name": "admin",
        "description": "someone who administrates"
    }
]

带有括号[]会导致POST请求失败。但是使用jsonlint.com验证器,我的两个json对象都可以验证。


阅读 565

收藏
2020-04-02

共2个答案

一尘不染

默认情况下,Django REST Framework中不包含CSRF。因此,curl POST请求工作正常。POSTMAN请求调用返回的CSRF错误,因为POSTMAN包含csrf令牌(如果在Cookies中找到的话)。您可以通过清理Cookies来解决此问题。

2020-04-02
一尘不染

它来自你的REST Framework设置。在settings.py文件中,你REST_FRAMEWORK应该具有以下内容。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
}

这会将你的REST框架设置为使用令牌身份验证而不是csrf身份验证。通过将权限设置为AllowAny,你可以仅在需要的地方进行身份验证。

2020-04-02