2016-07-04 3 views
1

django에서 실행중인 bbb.com에서 json 데이터를 수신하기 위해 교차 도메인 아약스 "GET"요청을 보내는 django로 일부 사이트 aaa.com을 개발 중입니다. REST 프레임 워크를 사용합니다. 이 시점에서 모든 것은 crossDomain: true; withCredentials:true을 추가하면 꽤 잘 작동합니다. 물론 aaa.com의 서버 측에서 구성됩니다.
...-Allow-Credentials: true; ...-Allow-Origin: bbb.com크로스 도메인 아약스 OPTIONS 오류 403 (장고)

주요 문제는 aaa.com이 PUT POST DELETE 아약스 요청을 만들려고 할 때 온다. 는 CORS 문서에 따르면 [https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0] 클라이언트 측 Ajax 요청이 올바른지
...-Allow-Headers, ...-Allow-Methods

...-Request-Headers, ...-Request-Methods

과 일치하므로,이 요청은 '단순한'모든 브라우저의 제 아니다으로부터 플라이트 요청을 보낸다 aaa.com에서 bbb.com으로 이동하여 일부 사용자 정의 헤더 및 메소드가 허용되는지 확인하십시오.

모든 것이 정상이지만 403 오류가 계속 발생합니다. 도메인 간 비행 전 요청이 쿠키를 포함 할 수 없기 때문에 불가능 사전 플라이트 요청에 쿠키를 : 그 서버를 실현

General: 
Request URL:http://bbb.com/api/someapipage/ 
Request Method:OPTIONS 
Status Code:403 Forbidden 
Remote Address:some ip:80 

Response Headers: 
Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:accept, content-type, x-csrftoken, x-requested-with 
Access-Control-Allow-Methods:GET, POST, OPTIONS, HEAD, PUT, DELETE 
Access-Control-Allow-Origin:http://aaa.com 
Allow:GET, POST, HEAD, OPTIONS 
Connection:Keep-Alive 
Content-Language:en 
Content-Type:application/json 
Date:Mon, 04 Jul 2016 14:20:38 GMT 
Keep-Alive:timeout=5, max=100 
Server:gunicorn/19.6.0 
Transfer-Encoding:chunked 
Vary:Accept,Accept-Language,Cookie 
X-Frame-Options:SAMEORIGIN 

Request Headers: 
Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8,ru;q=0.6 
Access-Control-Request-Headers:accept, content-type, x-csrftoken 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:aaa.com 
Origin:http://aaa.com 
Referer:http://aaa.com/ 
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 

이 문제를 해결하기 위해 시도의 주 후

바리 싶어 다음은 요청/응답입니다 헤더에.

나는이 문제에 어떤 해결책을 찾기 시작하고 발견 https://code.djangoproject.com/ticket/13217

"django.middleware.locale.LocaleMiddleware는 장고가가 '달라집니다 쿠키'추가하는 원인이 활성화. 헤더를 모든 reponse에" 그래서 localMiddleware는 비행 전 OPTIONS 응답에서도 Vary : Cookie 헤더를 추가합니다.

djang-cors-header을 사용하여 이러한 문제를 해결할 것을 권장합니다. 하지만이 패키지 기능을 사용하는 것은 서버 측의 설정과 같습니다.

나는 꽤 패키지 : django-dont-vary-on이 설치되어 있다면 Vary : 쿠키를 끄기 위해 데코레이터를 설정할 수 있지만 내 경우에는 OPTIONS 응답에서만 Vary : 쿠키를 꺼야합니다.

임 비트는 django에 새로운 것이고 실제로 이런 상황에서 무엇을해야할지 상상조차 할 수 없습니다. 내 발걸음은 광산에서 걷는 것과 같습니다. 해결책이나 대안이 있습니까?

답변

1

CORS가 클라이언트에 서버 액세스 권한을 허용해야합니다.

도메인 간 요청 인 경우 GET, HEAD 또는 POST 이외의 방법을 사용하면 요청이 사전 처리됩니다. 또한

, POST는 콘텐츠 형식으로 요청 데이터를 전송하는 데 사용되는 경우 다른 에 비해 응용 프로그램/x-www-form-urlencoded를, 다중/폼 데이터, 텍스트/일반, 그것은 preflighted된다.

도메인 간 클라이언트 요청을 처리하거나 거부하는 서버입니다 (기본값).

서버 측 응용 프로그램에 액세스 할 수 있으면 다음을 수행하여 응답을 얻을 수 있습니다.서버 측에

는 서버 측과 화이트리스트 클라이언트 도메인 또는 IP (그것은 또한 포트 특정) settings.py에서

pip install django-cors-headers 

django-cors-headers를 설치하여 INSTALLED_APPS에 추가

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

MIDDLEWARE_CLASSES에 corsheaders.middleware.CorsMiddleware 추가
MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    '**corsheaders.middleware.CorsMiddleware**', 
    'django.middleware.common.CommonMiddleware', 
.... 
) 

지금 당신이 CORS 허용 목록에 클라이언트를 추가로 CORS 화이트리스트

CORS_ORIGIN_WHITELIST = (
    'aaa.com', 
) 

을 정의, 당신은 지금 성공적으로 아약스 요청을 할 수있을 것입니다.

+0

답장을 보내 주셔서 감사합니다. 최대한 빨리 서버 측에 액세스 할 때 귀하의 솔루션을 시도합니다 –

+0

그건 내 문제를 해결! 정말 고맙습니다! –

+0

도움이 되었기 때문에 기쁩니다 :-) – kapilsdv