【问题标题】:Django @csrf_exempt decorator not workingDjango @csrf_exempt 装饰器不起作用
【发布时间】:2015-09-03 06:07:21
【问题描述】:

我在 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 标头内容。什么给了?

【问题讨论】:

  • 我认为是标题问题。

标签: python django csrf


【解决方案1】:

丹尼尔,事实证明你部分正确。它是 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

【讨论】:

    【解决方案2】:

    这与 CSRF 无关,CSRF 仅用于 POST 操作,由 Django 强制执行。

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

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

    【讨论】:

    • 您对 CORS 部分是正确的,但 jQuery 不是问题,需要将标头添加到响应中(来自 Django)。请参阅我的答案以了解它是如何完成的。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2019-04-12
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多