Heim Backend-Entwicklung Python-Tutorial 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

Mar 02, 2017 pm 03:50 PM

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>
Nach dem Login kopieren

Der Chrome-Browser meldet jedoch einen Fehler:

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

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.
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

In Settings.py hinzufügen:

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

...

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

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!


Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Apr 02, 2025 am 07:18 AM

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Apr 02, 2025 am 07:15 AM

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Apr 01, 2025 pm 11:15 PM

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Apr 01, 2025 pm 10:51 PM

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen an? Uvicorn ist ein leichter Webserver, der auf ASGI basiert. Eine seiner Kernfunktionen ist es, auf HTTP -Anfragen zu hören und weiterzumachen ...

Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Apr 01, 2025 pm 11:18 PM

Wie erstellt in Python ein Objekt dynamisch über eine Zeichenfolge und ruft seine Methoden auf? Dies ist eine häufige Programmieranforderung, insbesondere wenn sie konfiguriert oder ausgeführt werden muss ...

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

See all articles