当使用 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 工具/cURL/ 测试 CORS