我在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头部的东西。是什么给了什么?
答案 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