当使用 chrome POSTMAN 测试 http POST 时,它在 django 中不起作用

Posted

技术标签:

【中文标题】当使用 chrome POSTMAN 测试 http POST 时,它在 django 中不起作用【英文标题】:When tested http POST with chrome POSTMAN, it doesn't work in django 【发布时间】:2016-11-13 07:14:40 【问题描述】:

我用Django 1.9.7 & Python 3.5

我实现了创建用户机制并尝试使用 POSTMAN(chrome 应用程序)进行测试,但它不起作用,并且显示如下:

Forbidden (CSRF cookie not set.): /timeline/user/create/

这是代码:

urls.py

from django.conf.urls import url
From. import views

app_name = 'timeline'
urlpatterns = [
    # ex) /
    url(r'^$', views.timeline_view, name='timeline_view'),

    # ex) /user/create
    url(r'^user/(?P<method>create)/$', views.user_view, name='user_view'),
]

views.py

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, HttpResponse

from timeline.models import *


def timeline_view(request):
    return HttpResponse('hello world')


def user_view(request, method):
    if method == 'create' and request.method == 'POST':
        print("hi")
        username = request.POST.get('username')
        username = request.POST.get('username')
        user = User.objects.create_user(username, password=password)
        user.first_name = request.POST.get('name','')
        user.save()
        profile = UserProfile()
        profile.user = user
        profile.save()
        return HttpResponse('create success')
    else:
        return HttpResponse('bad request', status=400)

POSTMAN :

我试过Django CSRF Cookie Not Set,但我认为这篇文章是针对旧版本的。

【问题讨论】:

你已经定义了两次用户名...密码甚至没有一次 Django 需要 CSRF 令牌来允许请求,并且 Postman 在实现之前不会将其添加到标头中。请参考this 在请求标头中添加 csrf 令牌。 POST也是所有需要的,为什么创建,直到需要特定的东西。 请阅读django docs。默认情况下,django 将保护任何 POST 请求。您也可以只使用this,但不建议这样做。 【参考方案1】:

对于测试,我使用了@csrf_exempt 装饰器。

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def user_view(request, method):
    ...

现在你应该可以在没有 csrf cookie 的情况下调用这个函数了。

(上次我用的是django 1.8.7

来源: https://docs.djangoproject.com/en/1.9/ref/csrf/#edge-cases

【讨论】:

这并不能解决问题所问的问题。更多的解决方法。 这就是我写“用于测试...”的原因【参考方案2】:

您应该将CSRFToken 放在请求标头中。 通过邮递员发送请求后,查看响应Cookies部分,取csrftoken值并放入请求的Headers部分,如下所示: 键:X-CSRFToken 值:jSdh6c3VAHgLShLEyTjH2N957qCILqmb #your token value

【讨论】:

它说“服务器没有返回任何cookie”..? @user3595632 看起来很奇怪,你能在 chrome 开发工具中检查 cookie 吗? 是否可以在开发工具中检查本地主机测试?什么都不显示? @user3595632 你可以【参考方案3】:

“邮递员”中有时会出现版本问题:

我也遇到了同样的问题。在 POST 方法中使用最旧版本的邮递员发送数据时。 那个时候我在服务器端收到了空的json数据。我已经解决了这个问题,一旦我卸载了最旧版本的邮递员并安装了最新版本。

【讨论】:

突然开始报错,所有配置都很好,在其他计算机上运行良好,重新安装对我不起作用我认为由于安装了相同的版本,但我安装了 chrome 版本并且运行良好,也许是什么缓存了 cookie,但我不明白,谢谢!【参考方案4】:

在每个视图函数定义 (views.py) 之上使用以下语句。我们不需要使用 CRF 相关的语句。

@api_view(["POST", "GET"])

例如:

@api_view(["POST", "GET"])
def GivenInput():
   return Response(e.args[0],status.HTTP_400_BAD_REQUEST)

注意*: 但我不知道有任何替代方法可以使其在整个文件中成为全局。

【讨论】:

以上是关于当使用 chrome POSTMAN 测试 http POST 时,它在 django 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在Chrome下使用Postman进行rest请求测试

使用Postman在Chrome下进行rest请求测试

如何在Chrome下使用Postman进行rest请求测试

在 Chrome 控制台中使用 Postman 工具/cURL/ 测试 CORS

chrome浏览器,安装postman插件,实现json格式的接口测试

chrome浏览器,安装postman插件,实现json格式的接口测试