programing

Django 앱의 Access-Control-Allow-Origin

muds 2023. 4. 1. 10:06
반응형

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" 때문에 .nginx1MB로 하다★★★★★★★★★★★…

의 , ★★★★★★★★★★★★★★★★★★★★★의 패스nginx.conf/etc/nginx/nginx.conf.

우, 는, 는, 나, 나, 나, 나, 가, in, in, in, in, in, in, in in,client_max_body_sizehttp block에게 효과가 있었다.

http {
    ...
    client_max_body_size 200M;
}    

이 구성을 변경한 후 nginx를 다시 시작해야 합니다.

언급URL : https://stackoverflow.com/questions/22355540/access-control-allow-origin-in-django-app

반응형