Heim  >  Artikel  >  Backend-Entwicklung  >  Die Django-Anwendung von Python löst den domänenübergreifenden AJAX-Zugriff

Die Django-Anwendung von Python löst den domänenübergreifenden AJAX-Zugriff

高洛峰
高洛峰Original
2017-03-02 15:50:431445Durchsuche

Angesichts der domänenübergreifenden Probleme, die in Django beim Schreiben von APIs für AJAX-Aufrufe auftreten, fassen wir die Methoden der Django-Anwendungen von Python zusammen, um domänenübergreifende AJAX-Zugriffsprobleme zu lösen, indem wir die auf GitHub freigegebene Open-Source-Datei django-cors verwenden. Header werden besonders empfohlen

Einführung
verwendet Django, um eine API auf der Serverseite zu schreiben und gibt JSON-Daten zurück. Verwenden Sie Ajax, um die API aufzurufen:

<!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>

Der Chrome-Browser meldet jedoch einen Fehler:

No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource.

Nach etwas Google habe ich herausgefunden, dass dieses Problem durch CORS verursacht wird.

Was ist CORS?
CORS (Cross-Origin Resource Sharing) ist ein domänenübergreifender Zugriffsmechanismus, der es Ajax ermöglicht, domänenübergreifenden Zugriff zu erreichen.
Tatsächlich kann das Hinzufügen von „Access-Control-Allow-Origin: *“ zum Antwortheader des Servers CORS unterstützen. Informationen zur Konfiguration von Apache/Nginx usw. finden Sie im Referenzdokument.
Zum Beispiel:

  • API wird auf DomainA bereitgestellt;

  • Ajax-Datei wird auf DomainB bereitgestellt und die Ajax-Datei wird gesendet zur API-Anfrage, Daten zurückgeben;

  • Der Benutzer greift über DomainC auf die Ajax-Datei von DomainB zu und fordert Daten an

Der obige Prozess führt zu domänenübergreifender Zugriff. Wenn Sie Ajax direkt zum Anfordern verwenden, schlägt die Anfrage fehl, da Chrome Sie auffordert:

No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource.

So lösen Sie das Problem des domänenübergreifenden Ajax-Zugriffs ?
Es gibt zwei Möglichkeiten, domänenübergreifende Probleme zu lösen: 1. Verwenden Sie JSONP. 2. Machen Sie CORS wirksam.
Mit der JSONP-Methode müssen Sie den Server beispielsweise die Antwort im JSONP-Format zurückgeben lassen , Django kann JSONP-bezogene Dekoratoren hinzufügen, wie zum Beispiel: http://www.php.cn/ Da mir diese Methode nicht besonders gefällt, überspringe ich sie hier. Bitte lesen Sie die Referenzmaterialien unten.
Verwenden Sie CORS: Dies ist bequemer zu verwenden. Die meisten Browser unterstützen es jetzt und mein Webserver ist vollständig für den Aufruf anderer geöffnet, daher wird CORS empfohlen.
1. Verwenden Sie JSONP
Bei der Verwendung von Ajax zum Abrufen von JSON-Daten gibt es domänenübergreifende Einschränkungen. Beim Aufrufen von js-Skriptdateien auf einer Webseite ist diese jedoch nicht von der domänenübergreifenden Übertragung betroffen. Daher müssen wir den dataType im Ajax-Aufruf vom JSON- in das JSONP-Format ändern (die entsprechende API muss auch JSONP unterstützen).
JSONP kann nur für GET-Anfragen verwendet werden.

2. Ändern Sie die Datei „views.py“ direkt in Django
Ändern Sie die entsprechende API-Implementierungsfunktion in „views.py“, um anderen Domänen das Anfordern von Daten über Ajax zu ermöglichen:

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. Installieren Sie django-cors-headers
Hier ist eine weitere Entdeckung! In Django hat jemand die CORS-Header-Middleware entwickelt. Sie müssen nur einige einfache Konfigurationen in Settings.py vornehmen. Siehe: http://www.php.cn/ Jetzt können Sie es verwenden, die Serverseite ist vollständig geöffnet . Aktivieren Sie CORS. Es ist so cool, keine domänenübergreifenden Sorgen zu haben! ~
Django-cors-header installieren:

pip install django-cors-headers

In Settings.py hinzufügen:

INSTALLED_APPS = (
  ...
  &#39;corsheaders&#39;,
  ...
)

...

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

Sie können eine Whitelist konfigurieren, die den domänenübergreifenden Zugriff ermöglicht, oder sie direkt so einstellen, dass der gesamte domänenübergreifende Zugriff zulässig ist. Informationen zur spezifischen Konfiguration finden Sie in den Anweisungen auf der Github-Seite.

Weitere Artikel zu Pythons Django-Anwendung, die den domänenübergreifenden AJAX-Zugriff löst, finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn