Django API Post方法返回403错误

时间:2015-10-06 17:52:22

标签: python django http-post http-status-code-403

我正在尝试设置Django API(POST API端点)。我希望有相同的URL路径指向同一个处理不同的函数,因为它是POST或GET。因此,我使用了这样的方法

def handle_post(request):

    dict = {}
    dict['email'] = "test"

    if request.method == "POST":
        return HttpResponse(json.dumps(dict), content_type="application/json")

在url.py中,我有以下代码

router = routers.DefaultRouter()
router.register(r'notes', UsernotesViewSet)
urlpatterns = patterns('',
url(r'^', include(router.urls)),
url(r'^admin/', include(admin_site.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^docs/', include('rest_framework_swagger.urls')),
url(r'^example/postrequest', handle_post),
)

但是当我在网址http://127.0.0.1:8000/example/postrequest?requestid=abc&starthour=10上执行POST时,我无法完成这项工作。我没有发布任何内容,只是将方法从httpclient上的GET更改为POST以尝试此API。如果我没有将任何内容发布到URL,这样可以吗?

我收到403错误,如下所示:

  

禁止(403)
  CSRF验证失败。请求中止。
  您看到此消息是因为此站点在提交表单时需要CSRF cookie。出于安全原因,需要此cookie,以确保您的浏览器不会被第三方劫持。   如果您已将浏览器配置为禁用cookie,请重新启用它们,至少对于此站点或“同源”请求。

赞赏任何帮助。

3 个答案:

答案 0 :(得分:8)

我无法正确理解您的问题,但是当通过'不安全'方法请求时,会导致CSRF验证失败,例如POST,PUT和DELETE"在不使用针对CSRF(跨站点请求伪造)的推荐防御设置的情况下执行。

您可以在此link上阅读更多内容。

快速解决问题。您可以使用csrf_exempt装饰器将视图标记为免于CSRF View Middleware(django.middleware.csrf.CsrfViewMiddleware)确保的保护。示例:

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

您可以阅读有关here的更多信息。

答案 1 :(得分:3)

阅读CSRF protection上的Django文档。如果您的api将在浏览器中通过javascript访问,那么instructions有关于如何在ajax请求中包含令牌的信息。

如果以不同的方式访问API,例如从不使用cookie的移动客户端,使用csrf_exempt装饰器关闭该视图的CSRF保护可能是合适的。

答案 2 :(得分:0)

禁止(403) CSRF验证失败。请求中止。

您正在看到此消息,因为此站点在提交表单时需要CSRF cookie。出于安全原因,此cookie是必需的,以确保您的浏览器不会被第三方劫持。

如果您已将浏览器配置为禁用cookie,请至少对本网站或“同源”请求重新启用它们。

DEBUG = True可提供更多信息。