使用Phonegap访问Django应用程序中的Access-Control-Allow-Origin

Sas*_*ash 41 python django ajax cors cordova

我正在为基于Django的应用程序开发一个Phonegap应用程序,但在尝试进行Ajax调用时出现此错误:

XMLHttpRequest cannot load http://domain.herokuapp.com/getcsrf/?tags=jquery%2Cjavascript&tagmode=any&format=json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做我的Django应用程序允许一些网址的交叉起源?

这是我的Ajax代码:

get: function() {
    $.getJSON("http://domain.herokuapp.com/getcsrf/",
    {
        tags: "jquery,javascript",
        tagmode: "any",
        format: "json"
    },
    function(data) {
        $.each(data.items, function(item){
            console.log(item);
            });
    });
}
Run Code Online (Sandbox Code Playgroud)

sto*_*ter 72

Django默认情况下不提供提供交叉原点所必需的头文件.最简单的方法是使用这个为您处理它的Django应用程序:https://github.com/ottoyiu/django-cors-headers

然后,您可以使用设置设置要列入白名单的域

CORS_ORIGIN_WHITELIST = (
    'google.com',
    'hostname.example.com'
)
Run Code Online (Sandbox Code Playgroud)

支持允许所有,只需使用设置... CORS_ORIGIN_ALLOW_ALL = True 然后在中间件或视图中对请求进行任何过滤.

  • 对于使用Django 1.10或更高版本的用户,请使用:https://github.com/zestedesavoir/django-cors-middleware.原始链接不支持1.10. (5认同)
  • 该设置已重命名为“CORS_ALLOW_ALL_ORIGINS = True” (3认同)
  • 好的,已经安装了它,但似乎没有改变,也许是因为我想允许 3 个 url(使用 django-cors-heades 的任何提示或最佳实践?) (2认同)
  • 很好的答案,但没有提到您需要在 django 项目设置中添加 cors headers 应用程序和中间件,由于编辑队列已满,我添加了更详细的答案:/sf/answers/4749145271/ /10307728 (2认同)

mar*_*k01 10

对于单个视图,您可以手动添加标题:

@require_GET
def api_getto(request):
    response = JsonResponse(
        # your stuff here
    )
    response["Access-Control-Allow-Origin"] = "*"
    response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
    response["Access-Control-Max-Age"] = "1000"
    response["Access-Control-Allow-Headers"] = "X-Requested-With, Content-Type"
    return response
Run Code Online (Sandbox Code Playgroud)


ora*_*lar 8

您可以按照其他人的建议使用django-cors-headers,在撰写本文时,您需要遵循以下所有步骤。

要在项目中使用django-cors-headers ,请遵循cors headers 项目的 README 的设置配置部分中的指南,或阅读下面的内容(为了方便起见,我从 README 中复制了)。


设置

从 pip 安装:

python -m pip install django-cors-headers

然后将其添加到您已安装的应用程序中:

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]
Run Code Online (Sandbox Code Playgroud)

确保添加尾随逗号,否则可能会收到 ModuleNotFoundError(请参阅此博客文章)。

您还需要添加一个中间件类来监听响应:

MIDDLEWARE = [
    ...,
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...,
]
Run Code Online (Sandbox Code Playgroud)

CorsMiddleware应放置在尽可能高的位置,尤其是在任何可以生成响应的中间件(例如 DjangoCommonMiddleware或 Whitenoise )之前WhiteNoiseMiddleware。如果不是之前,它将无法将 CORS 标头添加到这些响应中。

另外,如果您正在使用CORS_REPLACE_HTTPS_REFERER它,则应将其放在 Django 的CsrfViewMiddleware.


配置

在 Django 设置中配置中间件的行为。您必须至少设置以下三个设置之一:

`CORS_ALLOWED_ORIGINS`
`CORS_ALLOWED_ORIGIN_REGEXES`
`CORS_ALLOW_ALL_ORIGINS`
Run Code Online (Sandbox Code Playgroud)

CORS_ALLOWED_ORIGINS

被授权发出跨站点 HTTP 请求的源列表。默认为[].

源由CORS RFC 第 3.2 节定义为 URI 方案 + 主机名 + 端口,或特殊值“null”或“file://”之一。默认端口(HTTPS = 443、HTTP = 80)在此处是可选的。

特殊值 null 由浏览器在“隐私敏感上下文”中发送,例如当客户端从 file:// 域运行时。根据此 bug ,Android 上某些版本的 Chrome 意外发送了特殊值 file:// 。

例子:

CORS_ALLOWED_ORIGINS = [
    "https://example.com",
    "https://sub.example.com",
    "http://localhost:8080",
    "http://127.0.0.1:9000"
]
Run Code Online (Sandbox Code Playgroud)

以前此设置称为CORS_ORIGIN_WHITELIST,它仍然作为别名使用,新名称优先。

CORS_ALLOWED_ORIGIN_REGEXES

表示与授权发出跨站点 HTTP 请求的源匹配的正则表达式的字符串列表。默认为[]. 当不切实际时有用CORS_ALLOWED_ORIGINS,例如当您有大量子域时。

例子:

CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https://\w+\.example\.com$",
]
Run Code Online (Sandbox Code Playgroud)

以前此设置称为CORS_ORIGIN_REGEX_WHITELIST,它仍然作为别名使用,新名称优先。

CORS_ALLOW_ALL_ORIGINS

如果True,则所有来源都将被允许。其他限制允许来源的设置将被忽略。默认为False.

设置此选项True可能很危险,因为它允许任何网站向您的网站发出跨源请求。CORS_ALLOWED_ORIGINS通常,您需要使用或来限制允许的来源列表CORS_ALLOWED_ORIGIN_REGEXES

以前此设置称为CORS_ORIGIN_ALLOW_ALL,它仍然作为别名使用,新名称优先。


Pra*_*han 5

您可以使用“django-cors-headers”。只需使用 pip 安装它:

    pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)

将“corsheaders”添加到您安装的应用程序中:

    INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]
Run Code Online (Sandbox Code Playgroud)

添加中间件:

    MIDDLEWARE = [
        ...,
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...,
    ]
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的“settings.py”中:

    CORS_ALLOWED_ORIGINS = [
        'http://siteyouwantto.allow.com',
        'http://anothersite.allow.com',
    ]
Run Code Online (Sandbox Code Playgroud)

如果您还想允许某些域发出“POST”请求,请将其添加到您的“settings.py”中,并且不要忘记将其添加到“CORS_ALLOWED_ORIGINS”中。

    CSRF_TRUSTED_ORIGINS = [
        'http://siteyouwantto.allow.com',
    ]
Run Code Online (Sandbox Code Playgroud)

我希望这能解决您的问题:)