Django REST Framework에서 CORS를 활성화하려면 어떻게해야합니까?


답변:


160

당신이 사용하는 것이 좋습니다 귀하의 질문에 언급 된 링크 django-cors-headers누구의 문서 라이브러리를 설치 말한다

pip install django-cors-headers

그런 다음 설치된 앱에 추가하십시오.

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

또한 응답을 수신하기 위해 미들웨어 클래스를 추가해야합니다.

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

다양한 설정에 특히주의하면서 설명서 의 구성 섹션 을 찾아보십시오 CORS_ORIGIN_. 필요에 따라 일부를 설정해야합니다.


2
새 종속성을 설치할 필요없이 다른 방법을 알고 있습니까? 지금은 미들웨어 클래스를 만들려고하고 있어요
훌리오 마린

5
@JulioMarins, 12 개의 릴리스, 21 명의 기여자, 800 개 이상의 별 및 100 개 이상의 포크를 사용하여 쉽게 사용할 수 있고 쉽게 설치할 수있는 자체 버전을 작성하는 이유는 무엇입니까?
Chris

2
실제로 요점이 있지만 간단한 CORS에 대한 유일한 필요는 헤더뿐이므로 Access-Control-Allow-Origin: *전체를로드하는 이유를 알 수 없으므로 두 가지 방법을 모두 사용할 수 있도록 답변에 다른 방법을 넣을 것입니다. 참조 : [링크 (] enable-cors.org/server.html )
훌리오 마린스

2
@JulioMarins, 그것은 큰 망치 접근 방식이 될 것입니다. 내가 제공 한 구성 링크를 보면 django-cors-headers그보다 훨씬 더 유연하다는 것을 알 수 있습니다. 나만의 수업을 만들고 싶다면 내 손님이 되십시오. 그러나 나는 그 라이브러리를 사용하고있을 것입니다.
Chris

4
@Chris CORS_ORIGIN_WHITELIST 를 추가 하여 호출 호스트를 화이트리스트에 추가해야한다고 생각합니다 .
Hakim

68
pip install django-cors-headers

그런 다음 설치된 앱에 추가하십시오.

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

또한 응답을 수신하기 위해 미들웨어 클래스를 추가해야합니다.

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',  
    'django.middleware.common.CommonMiddleware',  
    ...
)

CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
    'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [
    'http://localhost:3030',
]

자세한 내용 : https://github.com/ottoyiu/django-cors-headers/#configuration

공식 문서를 읽으면 거의 모든 문제를 해결할 수 있습니다.


4
@Chris의 답변에 추가 한 네 줄을 추가하면 이것이 나를 위해 작동하는 데 필요했습니다.
Matt D

5
CORS_ORIGIN_ALLOW_ALL = True이지만 CORS_ORIGIN_WHITELIST여전히 설정되어있는 이유는 무엇 입니까? 문서 는 이것이 필요하지 않은 것처럼 보이고 여기에 대한 대답을 혼란스럽게 만드는 것 같습니다.
phoenix

CORS_ORIGIN_ALLOW_ALL True이면 화이트리스트가 사용되지 않고 모든 출처가 수락됩니다.
BjornW

2
또한 'corsheaders.middleware.CorsMiddleware',목록의 맨 위에 있어야합니다. 그렇지 않으면 연결이 거부 될 수 있습니다.
Sebastián Vansteenkiste

16

최상의 옵션이 패키지의 테스트 된 접근 방식을 사용하는 것을 알고 있더라도 사용자 지정 미들웨어를 사용하여 수행 할 수 있습니다 django-cors-headers. 즉, 여기에 해결책이 있습니다.

다음 구조 및 파일을 만듭니다.

- myapp/middleware/__init__.py

from corsMiddleware import corsMiddleware

- myapp/middleware/corsMiddleware.py

class corsMiddleware(object):
    def process_response(self, req, resp):
        resp["Access-Control-Allow-Origin"] = "*"
        return resp

settings.py표시된 줄에 추가 :

MIDDLEWARE_CLASSES = (
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",

    # Now we add here our custom middleware
     'app_name.middleware.corsMiddleware' <---- this line
)

감사합니다 Julio! 미들웨어 코드는 @masnun 코드 샘플로 업데이트해야합니다. 또한 가져 오기가 작동하지 않아. 문제 해결 : from . import corsMiddleware
Pavel Daynyak

14

누군가가이 질문으로 돌아가서 자신의 미들웨어를 작성하기로 결정한 경우 Django의 새로운 스타일 미들웨어에 대한 코드 샘플입니다.

class CORSMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"

        return response

7

Django 버전> 1.10의 경우 문서 에 따르면 사용자 정의 MIDDLEWARE를 함수로 작성할 수 있습니다. 파일에서 다음 yourproject/middleware.py과 같이 말할 수 있습니다 settings.py.

def open_access_middleware(get_response):
    def middleware(request):
        response = get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"
        return response
    return middleware

마지막으로 프로젝트의 MIDDLEWARE 목록에이 함수의 파이썬 경로 (프로젝트 루트 작성)를 추가합니다 settings.py.

MIDDLEWARE = [
  .
  .
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]

쉬워요!


이전에 게시 된 접근 방식은 MIDDLEWARE가 아닌 MIDDLEWARE_CLASSES를 사용합니다. 이 기술은 downvote가 : @JulioMarins에 대해 지껄였다 있도록 작동
두식 Batheja

1
친구, 해결책은 동일합니다. Django 버전에서의 구현에 대해 논쟁하고 있습니다. 코드에 잘못된 들여 쓰기가 open_access_middleware있습니다.
Julio Marins

4

글쎄, 나는 사람들을 모르지만 :

여기서 python 3.6 및 django 2.2 사용

settings.py에서 MIDDLEWARE_CLASSES의 이름을 MIDDLEWARE로 변경했습니다.


4

다음은 외부 모듈이 필요없는 작업 단계입니다.

1 단계 : 앱에서 모듈을 만듭니다.

예를 들어 user_registration_app 이라는 앱이 있다고 가정 해 보겠습니다. . user_registration_app을 탐색하고 새 파일을 만듭니다.

이것을 custom_cors_middleware.py 라고 부를 수 있습니다.

아래 클래스 정의를 붙여 넣으십시오.

class CustomCorsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"

        # Code to be executed for each request/response after
        # the view is called.

        return response

2 단계: 미들웨어 등록

프로젝트 settings.py 파일에서 다음 줄을 추가하십시오.

'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'

예 :

  MIDDLEWARE = [
        'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
         ...
        'django.middleware.common.CommonMiddleware',

    ]

user_registration_app 을 교체 해야합니다. 을 custom_cors_middleware.py 모듈을 만든 앱의 이름 .

이제 프로젝트의 모든 뷰에 필요한 응답 헤더를 추가하는지 확인할 수 있습니다!


감사합니다! Access-Control-Allow-Headers 헤더가 누락되었습니다.
Dan

0

Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0

공식 지침을 따르십시오.

마지막으로 이전 방법을 사용하여 알아 내십시오.

더하다:

# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication


class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # To not perform the csrf check previously happening

#proj/settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'proj.middlewares.CsrfExemptSessionAuthentication',
    ),
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.