Django 앱의 Access-Control-Allow-Origin
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.
어떻게 하면 제 장고 앱이 몇몇 URL에 대해 교차 출처를 허용하도록 만들 수 있을까요?
내 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);
});
});
}
디폴트로는 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
그런 다음 미들웨어 또는 보기에서 요청을 필터링합니다.
단일 뷰의 경우 헤더를 수동으로 추가할 수 있습니다.
@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
'장고머리'로 하면 돼요.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',
]
이것으로 문제가 해결되었으면 합니다.
다른 사람들이 제안한 대로 장고-콜스-헤더를 사용할 수 있습니다.이것을 쓰려면 , 다음의 모든 순서를 따를 필요가 있습니다.
프로젝트에서 django-cors-headers를 사용하려면 cors headers 프로젝트의 README의 Setup 및 Configuration 섹션의 가이드를 따르거나 아래를 읽어 보십시오(편의를 위해 README에서 복사했습니다).
세우다
pip에서 설치:
python -m pip install django-cors-headers
설치한 앱에 추가합니다.
INSTALLED_APPS = [
...
'corsheaders',
...
]
반드시 말미에 콤마를 추가합니다.그렇지 않으면 Module Not Found Error가 표시될 수 있습니다(이 블로그 게시물 참조).
응답을 수신할 미들웨어 클래스도 추가해야 합니다.
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
CorsMiddleware
특히 Django와 같은 반응을 일으킬 수 있는 미들웨어보다 가능한 한 높게 배치해야 합니다.CommonMiddleware
또는 Whitenoise의WhiteNoiseMiddleware
이전 버전이 아닌 경우 이러한 응답에 CORS 헤더를 추가할 수 없습니다.
또, 를 사용하고 있는 경우는,CORS_REPLACE_HTTPS_REFERER
장고 앞에 놓아야지CsrfViewMiddleware
.
배열
Django 설정에서 미들웨어 동작을 구성합니다.다음의 3개의 설정 중 적어도1개를 설정할 필요가 있습니다.
`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:// 도메인에서 실행되는 경우와 같이 "개인정보에 민감한 컨텍스트"에서 브라우저에 의해 전송됩니다.이 버그로 인해 Android의 Chrome 일부 버전에서 특별한 값 파일://이 실수로 전송되었습니다.
예:
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 요청을 만들 수 있는 Origins와 일치하는 정규식을 나타내는 문자열 목록입니다.은 "" 입니다.[]
. 의 경우에 편리합니다.CORS_ALLOWED_ORIGINS
많은 수의 하위 도메인이 있는 경우 등, 비실용적입니다.
예:
CORS_ALLOWED_ORIGIN_REGEXES = [
r"^https://\w+\.example\.com$",
]
에는 이 을 「이러한 설정」이라고 .CORS_ORIGIN_REGEX_WHITELIST
에일리어스로 기능하며 새 이름이 우선됩니다.
CORS_ALLOW_ALL_ORIGINS
ifTrue
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .허용된 원점을 제한하는 다른 설정은 무시됩니다.은 "" 입니다.False
.
을 「」로 설정합니다.True
모든 웹 사이트가 사용자에게 교차 요청을 할 수 있기 때문에 위험할 수 있습니다.은 '출처 제한'으로 하는 것이 CORS_ALLOWED_ORIGINS
★★★★★★★★★★★★★★★★★」CORS_ALLOWED_ORIGIN_REGEXES
.
에는 이 을 「이러한 설정」이라고 .CORS_ORIGIN_ALLOW_ALL
에일리어스로 기능하며 새 이름이 우선됩니다.
, 이 는 "1MB" 때문에 .nginx
1MB로 하다★★★★★★★★★★★…
의 , ★★★★★★★★★★★★★★★★★★★★★의 패스nginx.conf
/etc/nginx/nginx.conf
.
우, 는, 는, 나, 나, 나, 나, 가, in, in, in, in, in, in, in in,client_max_body_size
http block
에게 효과가 있었다.
http {
...
client_max_body_size 200M;
}
이 구성을 변경한 후 nginx를 다시 시작해야 합니다.
언급URL : https://stackoverflow.com/questions/22355540/access-control-allow-origin-in-django-app
'programing' 카테고리의 다른 글
JSON을 프로그램적으로 아름답게 하려면 어떻게 해야 하나요? (0) | 2023.04.01 |
---|---|
Mongodb에서 단일 문서의 크기를 얻는 방법은 무엇입니까? (0) | 2023.04.01 |
로컬에서 값을 읽습니다.vs 2017 Azure Function 개발에서 settings.json을 소개합니다. (0) | 2023.04.01 |
401(Authentication Error)을 액시스로 처리하여 어떻게 대응합니까? (0) | 2023.04.01 |
AngularJS용 커스텀 모듈은 어떻게 작성합니까? (0) | 2023.04.01 |