cordova Django应用中的访问控制-允许-起源

hpcdzsge  于 2022-11-15  发布在  Go
关注(0)|答案(5)|浏览(201)

我正在为基于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.

我怎样才能让我的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);
            });
    });
}
fnvucqvd

fnvucqvd1#

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

  • 添加到已安装的应用程序
  • 添加到中间件
  • 然后是...
CORS_ALLOWED_ORIGINS = [
    "http://read.only.com",
    "http://change.allowed.com",
]

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

a5g8bdjr

a5g8bdjr2#

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

@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
voase2hg

voase2hg3#

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

pip install django-cors-headers

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

INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]

添加中间件:

MIDDLEWARE = [
        ...,
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...,
    ]

然后将以下内容添加到您的“settings.py“:

CORS_ALLOWED_ORIGINS = [
        'http://siteyouwantto.allow.com',
        'http://anothersite.allow.com',
    ]

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

CSRF_TRUSTED_ORIGINS = [
        'http://siteyouwantto.allow.com',
    ]

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

n3schb8v

n3schb8v4#

你可以像其他人建议的那样使用django-cors-headers,在写这篇文章时,你需要遵循下面的所有步骤。
要在你的项目中使用django-cors-headers,请按照cors headers项目的README的SetupConfiguration部分中的指南操作,或者阅读下面的内容(为了方便起见,我从README中复制了这些内容)。

设置

从管道安装:
python -m pip install django-cors-headers
然后将其添加到已安装的应用程序:

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

请确保添加结尾逗号,否则可能会出现ModuleNotFoundError(请参见this blog post)。
您还需要添加一个中间件类来侦听响应:

MIDDLEWARE = [
    ...,
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...,
]

CorsMiddleware应该放在尽可能高的位置,特别是在任何可以生成响应的中间件之前,比如Django的CommonMiddleware或Whitenoise的WhiteNoiseMiddleware。如果不在之前,它将无法向这些响应添加CORS头。
同样,如果你使用CORS_REPLACE_HTTPS_REFERER,它应该放在Django的CsrfViewMiddleware之前。

配置

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

`CORS_ALLOWED_ORIGINS`
`CORS_ALLOWED_ORIGIN_REGEXES`
`CORS_ALLOW_ALL_ORIGINS`

CORS_ALLOWED_ORIGINS

受权发出跨网站HTTP要求的来源清单。预设值为[]
来源由CORS RFC第3.2节定义为URI方案+主机名+端口,或特殊值'null'或'file://'之一。默认端口(HTTPS = 443,HTTP = 80)在此处是可选的。
特殊值null由浏览器在“隐私敏感上下文”中发送,例如当客户端从file://域运行时。特殊值file://由Android上的某些Chrome版本意外发送,如this bug
示例:

CORS_ALLOWED_ORIGINS = [
    "https://example.com",
    "https://sub.example.com",
    "http://localhost:8080",
    "http://127.0.0.1:9000"
]

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

CORS_ALLOWED_ORIGIN_REGEXES(第一次)

代表正则表达式的字符串列表,这些正则表达式与被授权进行跨站点HTTP请求的源匹配。默认值为[]。当CORS_ALLOWED_ORIGINS不可行时(例如,当您有大量子域时)很有用。
示例:

CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https://\w+\.example\.com$",
]

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

CORS_ALLOW_ALL_ORIGINS

如果为True,则允许所有来源。将忽略限制允许来源的其他设置。默认为False
设置为True是危险的,因为它允许任何网站向您的网站发出跨源请求。通常您会希望使用CORS_ALLOWED_ORIGINSCORS_ALLOWED_ORIGIN_REGEXES来限制允许的源列表。
以前,此设置称为CORS_ORIGIN_ALLOW_ALL,它仍然作为别名工作,新名称优先。

ltqd579y

ltqd579y5#

在我的情况下,我张贴了一个文件超过1 MB,我得到这个错误,因为nginx配置(默认最大大小1 MB),所以......
对我来说,nginx.conf的路径是/etc/nginx/nginx.conf
在我的例子中,我只是在http block中添加了client_max_body_size,它对我很有效

http {
    ...
    client_max_body_size 200M;
}

确保在更改此配置后重新启动nginx

相关问题