AJAX 호출용 API를 작성할 때 Django에서 발생하는 도메인 간 문제를 고려하여, 오픈 소스로 공유되는 django-cors를 포함하여 AJAX 도메인 간 액세스 문제를 해결하기 위한 Python의 Django 애플리케이션 방법을 요약해 보겠습니다. GitHub.Header는 특히 권장됩니다
소개
는 Django를 사용하여 서버 측에서 API를 작성하고 JSON 데이터를 반환합니다. Ajax를 사용하여 API 호출:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/> <title>test</title> </head> <body> <button onclick="showPersonInfo()">点我获取数据</button> </body> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script> function showPersonInfo(){ $.getJSON( 'http://xxx/account/getuserinfo/', {username: "abc"}, function(json) { var html='<br>'+'用户名:'+json.username+'<br>'+'姓:'+json.first_name+'<br>'+'名:'+json.last_name+'<br>'+'邮箱'+json.email; document.write(html); } ) } </script> </html>
그러나 Chrome 브라우저에서는 오류 메시지가 표시됩니다.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Google을 검색해 본 결과 이 문제는 CORS에 의해 발생하는 것으로 나타났습니다.
CORS란 무엇인가요?
CORS(Cross-Origin Resource Sharing)는 Ajax가 도메인 간 액세스를 달성할 수 있도록 하는 도메인 간 액세스 메커니즘입니다.
실제로 서버의 응답 헤더에 "Access-Control-Allow-Origin: *"를 추가하면 CORS를 지원할 수 있습니다. apache/nginx 등을 구성하는 방법은 참조 문서를 참조하세요.
예:
API가 DomainA에 배포됩니다.
Ajax 파일이 DomainB에 배포되고 Ajax 파일이 전송됩니다. API 요청에 데이터를 반환합니다.
사용자는 DomainC를 통해 DomainB의 Ajax 파일에 액세스하여 데이터를 요청합니다.
위 프로세스의 결과는 다음과 같습니다. 도메인 간 액세스. Ajax를 직접 사용하여 요청하면 Chrome에서
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Ajax 교차 도메인 액세스 문제를 해결하는 방법을 묻는 메시지와 같이 실패합니다.
교차 도메인 문제를 해결하는 방법에는 두 가지가 있습니다. 1. jsonp를 사용합니다. 2. CORS를 효과적으로 만듭니다.
jsonp 방법을 사용하면 서버가 jsonp 형식으로 응답을 다시 보내도록 해야 합니다. , Django는 http://www.php.cn/과 같은 jsonp 관련 데코레이터를 추가할 수 있습니다. 저는 이 방법을 별로 좋아하지 않으므로 여기서는 아래 참고 자료를 참조하면 됩니다.
CORS 사용: 이제 대부분의 브라우저가 이를 지원하며, 내 웹 서버는 다른 사람이 호출할 수 있도록 완전히 열려 있으므로 CORS를 권장합니다.
1. JSONP 사용
Ajax를 사용하여 json 데이터를 얻을 때 도메인 간 제한이 있습니다. 그러나 웹 페이지에서 js 스크립트 파일을 호출하면 교차 도메인의 영향을 받지 않습니다. JSONP는 이를 사용하여 도메인 간 전송을 달성합니다. 따라서 Ajax 호출의 dataType을 JSON에서 JSONP(해당 API도 JSONP를 지원해야 함) 형식으로 변경해야 합니다.
JSONP는 GET 요청에만 사용할 수 있습니다.
2. Django에서 views.py 파일을 직접 수정합니다.
다른 도메인이 Ajax를 통해 데이터를 요청할 수 있도록 views.py에서 해당 API 구현 기능을 수정합니다.
def myview(_request): response = HttpResponse(json.dumps({"key": "value", "key2": "value"})) response["Access-Control-Allow-Origin"] = "*" response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS" response["Access-Control-Max-Age"] = "1000" response["Access-Control-Allow-Headers"] = "*" return response
3. django-cors-headers 설치
여기서 또 다른 발견이 있습니다! Django에서는 누군가 CORS 헤더 미들웨어를 개발했습니다. settings.py에서 몇 가지 간단한 구성만 하면 됩니다. http://www.php.cn/ 이제 CORS를 사용할 수 있도록 완전히 열려 있습니다. . 도메인 간 걱정이 없어서 너무 좋아요! ~
django-cors-headers 설치:
pip install django-cors-headers
settings.py에 추가:
INSTALLED_APPS = ( ... 'corsheaders', ... ) ... MIDDLEWARE_CLASSES = ( ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... )
교차 도메인 액세스를 허용하는 화이트리스트를 구성하거나 모든 교차 도메인 액세스를 허용하도록 직접 설정할 수 있습니다. 구체적인 구성은 해당 Github 페이지 지침을 참조하세요.
AJAX 크로스 도메인 액세스를 해결하는 Python의 Django 애플리케이션과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!