希望有人向我展示如何使用带有 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
可以使用 GET 请求,我可以下拉数据库中的所有角色,但我似乎无法创建任何新角色。我没有设置权限。我在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."
}
这里发生了什么,解决方法是什么?localhost 是跨站点请求吗?我已经添加@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 对象都会验证。
更新:问题在于使用 PostMan 发送 POST,而不是在后端。见https://stackoverflow.com/a/17508420/203312