>백엔드 개발 >파이썬 튜토리얼 >Python의 Django 애플리케이션으로 AJAX 교차 도메인 액세스 문제 해결

Python의 Django 애플리케이션으로 AJAX 교차 도메인 액세스 문제 해결

高洛峰
高洛峰원래의
2017-03-02 15:50:431472검색

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(
        &#39;http://xxx/account/getuserinfo/&#39;,
        {username: "abc"},
        function(json) {
          var html=&#39;<br>&#39;+&#39;用户名:&#39;+json.username+&#39;<br>&#39;+&#39;姓:&#39;+json.first_name+&#39;<br>&#39;+&#39;名:&#39;+json.last_name+&#39;<br>&#39;+&#39;邮箱&#39;+json.email;    
          document.write(html);
        }
      )
    }
  </script>
</html>

그러나 Chrome 브라우저에서는 오류 메시지가 표시됩니다.

No &#39;Access-Control-Allow-Origin&#39; 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 &#39;Access-Control-Allow-Origin&#39; 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 = (
  ...
  &#39;corsheaders&#39;,
  ...
)

...

MIDDLEWARE_CLASSES = (
  ...
  &#39;corsheaders.middleware.CorsMiddleware&#39;,
  &#39;django.middleware.common.CommonMiddleware&#39;,
  ...
)

교차 도메인 액세스를 허용하는 화이트리스트를 구성하거나 모든 교차 도메인 액세스를 허용하도록 직접 설정할 수 있습니다. 구체적인 구성은 해당 Github 페이지 지침을 참조하세요.

AJAX 크로스 도메인 액세스를 해결하는 Python의 Django 애플리케이션과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.