Django @csrf_exempt装饰工作不通

时间:2015-06-17 19:55:49

标签: python django csrf

我在linode服务器上使用DJango 1.8,并有以下观点:

import json

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

def home_view(request):
        r = { 'response': 'OK', 'data': None }
        return HttpResponse(json.dumps(r), content_type = "application/json")

@csrf_exempt
def ping(request):
        r = { 'response': 'OK', 'data': 'ping' }
        return HttpResponse(json.dumps(r), content_type = "application/json")

我的网址看起来像这样:

urlpatterns = [
    url(r'^django/admin/', include(admin.site.urls)),
    url(r'^django/$', home_view),
    url(r'^django/ping/$', ping),
    url(r'^django/echo/$', echo),
]

如果我去我的linode网站 http://mylinodesite/django/ping/

我明白了:

{"data": "ping", "response": "OK"}

大。如果我使用jquery并做一个

$.get("http://mylinodesite/django/ping/")

我得到了

No 'Access-Control-Allow-Origin' header is present on the requested resource.

根据我的理解@csrf_exempt应该摆脱CSRF头部的东西。是什么给了什么?

2 个答案:

答案 0 :(得分:2)

这与CSRF没有任何关系,CSRF仅适用于POST操作,由Django强制执行。

您正在进行跨域GET操作。默认情况下,浏览器禁止这样做,因为所谓的同源策略:JS脚本只能向其加载的同一域发出请求。所以,浏览器本身阻止了你。

要启用对命名域的请求,您可以使用名为CORS的内容,该请求在请求中使用标头。请参阅jQuery Ajax documentation

答案 1 :(得分:2)

丹尼尔,事实证明你是对的。它是CORS但它不能在jQuery方面修复。这是我的Django视图代码,可以满足我的需求。请注意,它会添加Access-Control-Allow-Origin标头,以便仅允许来自*的所有GET}的请求。

这也只是演示了如何在一个文件中完成所有操作。如果需要,可以创建中间件来为所有请求执行此操作,但这是有效的,并且是如何在一个地方完成所有操作的一个很好的示例,以便您可以看到正在发生的事情,并here is the full gist of the entire view file

def ping(request):
        r = { 'response': 'OK', 'data': 'ping' }
        response = HttpResponse("['ok']", content_type="application/json")
        response['Access-Control-Allow-Origin'] = '*'
        response['Access-Control-Allow-Methods'] = 'GET'

        return response