programing

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

lastmoon 2023. 7. 6. 22:30
반응형

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

장고 REST 프레임워크에서 CORS를 활성화하려면 어떻게 해야 합니까?참조는 별로 도움이 되지 않습니다. 미들웨어로 할 수 있다고 되어 있습니다만, 어떻게 해야 합니까?

질문에서 참조한 링크는 를 사용할 것을 권장합니다. 이 링크의 문서에는 라이브러리를 설치하라는 내용이 나와 있습니다.

python -m pip install django-cors-headers

설치된 앱에 추가합니다.

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

응답을 청취하려면 미들웨어 클래스도 추가해야 합니다.

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

CORS에 대한 도메인을 지정합니다. 예:

CORS_ALLOWED_ORIGINS = [
    'http://localhost:3030',
]

문서의 구성 섹션을 살펴보십시오. 특히 다양한 정보에 주의하십시오.CORS_ORIGIN_설정. 에 따라 필요에 따라 설정해야 합니다.

python -m pip install django-cors-headers

설치된 앱에 추가합니다.

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

응답을 청취하려면 미들웨어 클래스도 추가해야 합니다.

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

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

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

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

된 접근 하는 것임을 사용자 미들웨어를 할 수 .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
)

이 질문으로 돌아가서 자신만의 미들웨어를 쓰기로 결정하는 사람이 있다면, 이것은 장고의 새로운 스타일 미들웨어의 코드 샘플입니다.

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

Django 버전이 1.10 이상인 경우 설명서에 따라 사용자 정의 미들웨어를 함수로 작성할 수 있습니다. 파일에서 다음과 같이 가정합니다.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

마지막으로 r.t합니다.settings.py:

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

진정해요!

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

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

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

이를 custom_cors_middleware라고 부릅니다.파이의

아래 클래스 정의를 붙여넣습니다.

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_middleware.CustomCors 미들웨어'

예:

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

    ]

user_registration_app을 custom_cors_middleware.py 모듈을 만든 앱의 이름으로 바꾸는 것을 잊지 마십시오.

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

Django v3.x.x의 최신 버전을 사용하는 모든 사람을 위해 2021년 업데이트된 모든 원산지에서 CORS를 허용하는 단계는 아래와 같습니다.

1단계: 필요한 라이브러리 설치

pip install django-cors-headers

2단계: 그런 다음 INSTALLED_APPs에서 적절한 위치에 추가합니다.settings.pyrest_framework에 그리당고신청전에의신▁and전에▁your▁before신그ation청.myapp

'rest_framework',
'corsheaders',
'myapp.apps.MyAppConfig',

합니다(내부 3단계: api의 경우).settings.py)

CORS_ORIGIN_WHITELIST = (
'http://localhost:3000',  # for localhost (REACT Default)
'http://192.168.10.45:3000', # for network
)

2022년 업데이트 및 새로운 사용 사례 추가

Axios POST를 withCredentials: true고려해야 할 몇 가지 추가 옵션이 있습니다.

Basic 또는 Session 로그인을 통한 인증에 이 특정 사례를 사용했습니다.

다음과 같이 오류 메시지를 방지하려면:

비행 전 요청에 대한 응답이 액세스 제어 검사를 통과하지 못했습니다.응답에서 'Access-Control-Allow-Credentials' 헤더의 값은 '참'입니다. 요청의 자격 증명 모드가 '포함'인 경우 이 값은 '참'이어야 합니다.XMLHttpRequest에 의해 시작된 요청의 자격 증명 모드는 withCredentials 특성에 의해 제어됩니다.

그리고 다른 사람들이 언급한 위의 내용.저는 이런 식으로 문제를 해결했습니다.

[IP 주소는 제 지역 사례에서 가져온 것입니다. 변경하려고 합니다.]

설정파이의

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

ALLOWED_HOSTS = ["localhost","192.168.0.50"]

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',  # for localhost (REACT Default)
    'http://192.168.0.50:3000',  # for network 
    'http://localhost:8080',  # for localhost (Developlemt)
    'http://192.168.0.50:8080',  # for network (Development)
)

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:3000',  # for localhost (REACT Default)
    'http://192.168.0.50:3000',  # for network 
    'http://localhost:8080',  # for localhost (Developlemt)
    'http://192.168.0.50:8080',  # for network (Development)
]

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

]

브라우저에서 Axios 요청 헤더를 전송하고 서버 사이트에서 헤더를 허용해야 합니다.그렇지 않으면 오류 메시지가 표시됩니다.

요청 헤더 필드 access-control-allow-origin은 비행 전 응답에서 Access-Control-Allow-Headers에 의해 허용되지 않습니다.

지금까지 머리글을 사용합니다.필요한 경우 다음과 같은 헤더를 추가할 수 있습니다.

CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]

건배 :)

글쎄, 남자들은 모르지만,

여기서 python 3.6 및 django 2.2 사용

설정에서 MIDDLEWARE_CLASSES의 이름을 MIDDLEWARE로 변경합니다.py worked.

처음 설치된 장고 패키지

pip install django-cors-headers

설정 파일의 앱에 추가

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

그런 다음 설정 파일에 코르스 미들웨어를 추가합니다.

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

그리고 마지막으로 교차 오리진 화이트리스트를 추가합니다.

#CORS_ORIGIN_ALLOW_ALL = True
#CORS_ALLOW_CREDENTIALS = True
#CORS_ALLOW_HEADERS = ['*']
CORS_ORIGIN_WHITELIST = ('http://localhost:5000',)

코르스 오류를 쉽게 해결할 수 있습니다.해피 코딩

장고=2.2.12 장고-고-고-고-고=3.2.1 장고레스트 프레임워크=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',
    ),
}

모든 제안된 해결책을 시도해 본 결과 아무 것도 효과가 없는 것 같았습니다.브라우저 캐시를 삭제하여 문제를 해결했습니다.

그런 다음 승인된 답변은 다음을 사용하여 작동합니다.django-cors-headers.

이것이 다른 누군가에게 도움이 되기를 바랍니다!

언급URL : https://stackoverflow.com/questions/35760943/how-can-i-enable-cors-on-django-rest-framework

반응형