Django REST Framework에서 CORS를 활성화하려면 어떻게해야합니까? 참조 그것이 내가 미들웨어에 의해 할 수 있다고 많은 도움이되지 않습니다,하지만 난 어떻게 그렇게 할 수 있습니까?
답변:
당신이 사용하는 것이 좋습니다 귀하의 질문에 언급 된 링크 django-cors-headers
누구의 문서 라이브러리를 설치 말한다
pip install django-cors-headers
그런 다음 설치된 앱에 추가하십시오.
INSTALLED_APPS = (
...
'corsheaders',
...
)
또한 응답을 수신하기 위해 미들웨어 클래스를 추가해야합니다.
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
다양한 설정에 특히주의하면서 설명서 의 구성 섹션 을 찾아보십시오 CORS_ORIGIN_
. 필요에 따라 일부를 설정해야합니다.
Access-Control-Allow-Origin: *
전체를로드하는 이유를 알 수 없으므로 두 가지 방법을 모두 사용할 수 있도록 답변에 다른 방법을 넣을 것입니다. 참조 : [링크 (] enable-cors.org/server.html )
django-cors-headers
그보다 훨씬 더 유연하다는 것을 알 수 있습니다. 나만의 수업을 만들고 싶다면 내 손님이 되십시오. 그러나 나는 그 라이브러리를 사용하고있을 것입니다.
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
공식 문서를 읽으면 거의 모든 문제를 해결할 수 있습니다.
'corsheaders.middleware.CorsMiddleware',
목록의 맨 위에 있어야합니다. 그렇지 않으면 연결이 거부 될 수 있습니다.
최상의 옵션이 패키지의 테스트 된 접근 방식을 사용하는 것을 알고 있더라도 사용자 지정 미들웨어를 사용하여 수행 할 수 있습니다 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
)
from . import corsMiddleware
누군가가이 질문으로 돌아가서 자신의 미들웨어를 작성하기로 결정한 경우 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
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'
]
쉬워요!
open_access_middleware
있습니다.
다음은 외부 모듈이 필요없는 작업 단계입니다.
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 모듈을 만든 앱의 이름 .
이제 프로젝트의 모든 뷰에 필요한 응답 헤더를 추가하는지 확인할 수 있습니다!
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',
),
}