希望有人向我展示如何使用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对象都可以验证。
默认情况下,Django REST Framework中不包含CSRF。因此,curl POST请求工作正常。POSTMAN请求调用返回的CSRF错误,因为POSTMAN包含csrf令牌(如果在Cookies中找到的话)。您可以通过清理Cookies来解决此问题。
它来自你的REST Framework设置。在settings.py文件中,你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,你可以仅在需要的地方进行身份验证。