当前位置: 首页 > 面试题库 >

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

段志
2023-03-14
问题内容

希望有人向我展示如何使用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来解决此问题。



 类似资料:
  • 问题内容: 在这里是Django的初学者,我已经尝试了很长时间了。我的中间件类中确实有“ django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子中确实有令牌。 这是我的代码,我在做什么错? 这是我的模板: 问题答案: 你应该使用自动使用的快捷功能 使用https://docs.djangoproject.com/en/2.2/topics/http/sh

  • 问题内容: 我正在使用Django 1.7和django-rest-framework。 我制作了一个API,该API返回了一些JSON数据,并将其放入了我的 settings.py 当我进行GET调用时,它将返回我所有的数据,但是当我尝试使用PUT / PATCH时,我得到: 仅当我登录时才会发生这种情况,如果我是匿名用户,则可以正确进行PUT / PATCH。 我尝试过,但遇到错误,我将设置包

  • 问题内容: 我有Django的1.3版。我尝试按照其他人的问题指定localhost:8000,但这对我不起作用。我正在尝试使用文件上传表单,但是我收到一个错误,即form.py没有CSRF令牌。 form.py: views.py: upload.html: 我很沮丧,请告诉我一些尝试的方法。谢谢 问题答案: 你需要传递 为此:(views.py) 这会将csrf的令牌传递到模板。

  • 问题内容: 我尝试发布参数像 但是, 我正在使用Django返回,找不到在不影响安全性的情况下如何防止此问题。 问题答案: 你可以通过两种不同的方式发出AJAX发布请求: 告诉你的视图不要检查csrf令牌。这可以通过使用decorator来完成,如下所示: 要将csrf令牌嵌入每个AJAX请求中,对于jQuery,它可能是: 该getCookie函数从cookie检索csrf令牌的位置。我使用以下

  • 我读到,当使用JWT时,不需要防止CSRF攻击,例如:“由于您不依赖cookie,您不需要防止跨站点请求”。 但是,有一点我不明白:如果我将令牌存储在localStorage中(正如我在同一网站的教程中被告知的那样),那么攻击者如何防止通过读取我的localStorage而不是Cookie来伪造恶意请求呢? 由于它是在服务器端生成的,我不知道如何在客户机请求中使用令牌而不将其存储在客户机的某个地方

  • 问题内容: 我在网站上启用了CSRF保护,但是CSRF令牌唯一一次放置在隐藏字段中的时间是何时使用。我正在通过ajax发布数据,并且也需要发送CSRF以防止出现500个错误。 我以为有一种方法可以将CSRF令牌显式地嵌入到页面中,但是我似乎找不到它。 如果页面上没有表单,如何获得CSRF令牌? 问题答案: 您可以通过安全性类获取CSRF令牌名称和值: