Maison >développement back-end >Tutoriel Python >L'application Django de Python résout l'accès inter-domaines AJAX
Au vu des problèmes inter-domaines rencontrés dans Django lors de l'écriture d'API pour les appels AJAX, résumons les méthodes des applications Django de Python pour résoudre les problèmes d'accès inter-domaines AJAX, en utilisant le open source django-cors- partagé sur GitHub. Les en-têtes sont particulièrement recommandés
Introduction
utilise Django pour écrire une API côté serveur et renvoie une donnée JSON. Utilisez Ajax pour appeler l'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>
Cependant, le navigateur Chrome affiche une erreur :
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Après quelques recherches sur Google, j'ai découvert que ce problème était causé par CORS.
Qu'est-ce que CORS ?
CORS (Cross-Origin Resource Sharing) est un mécanisme d'accès inter-domaines qui permet à Ajax d'obtenir un accès inter-domaines.
En fait, ajouter "Access-Control-Allow-Origin: *" à l'en-tête de réponse du serveur peut prendre en charge CORS. C'est très simple. Pour savoir comment configurer Apache/nginx, etc., consultez le document de référence.
Par exemple :
L'API est déployée sur DomainA
Le fichier Ajax est déployé sur DomainB, et le fichier Ajax sera envoyé à la requête API, renvoyer les données
L'utilisateur accède au fichier Ajax de DomainB via DomainC et demande des données
Le processus ci-dessus aboutit à accès inter-domaines. Si vous utilisez directement Ajax pour effectuer une demande, celle-ci échouera, comme le demande Chrome :
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Comment résoudre le problème d'accès inter-domaines Ajax ?
Il existe deux méthodes pour résoudre les problèmes inter-domaines : 1. Utiliser jsonp 2. Rendre CORS efficace
En utilisant la méthode jsonp, vous devez laisser le serveur remettre la réponse au format jsonp par exemple. , Django peut ajouter un décorateur lié à jsonp, tel que : http://www.php.cn/ Comme je n'aime pas beaucoup cette méthode, je la saute ici. Vous pouvez vous référer aux documents de référence ci-dessous.
Utiliser CORS : c'est plus pratique à utiliser. La plupart des navigateurs le prennent désormais en charge et mon serveur Web est complètement ouvert aux autres appels, donc CORS est recommandé.
1. Utilisez JSONP
Lorsque vous utilisez Ajax pour obtenir des données JSON, il existe des restrictions inter-domaines. Cependant, lors de l'appel de fichiers de script js sur une page Web, celui-ci n'est pas affecté par l'inter-domaine. JSONP l'utilise pour réaliser une transmission inter-domaine. Par conséquent, nous devons modifier le format dataType dans l'appel Ajax de JSON à JSONP (l'API correspondante doit également prendre en charge JSONP).
JSONP ne peut être utilisé que pour les requêtes GET.
2. Modifiez directement le fichier vues.py dans Django
Modifiez la fonction d'implémentation de l'API correspondante dans vues.py pour permettre à d'autres domaines de demander des données via Ajax :
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. Installez django-cors-headers
Voici une autre découverte ! Dans Django, quelqu'un a développé le middleware CORS-header. Il vous suffit de faire quelques configurations simples dans settings.py Voir : http://www.php.cn/ Maintenant que vous pouvez l'utiliser, le côté serveur est complètement ouvert. . Activez CORS. C'est tellement cool de n'avoir aucun souci inter-domaines ! ~
Installer django-cors-headers :
pip install django-cors-headers
Ajouter settings.py :
INSTALLED_APPS = ( ... 'corsheaders', ... ) ... MIDDLEWARE_CLASSES = ( ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... )
Vous pouvez configurer une liste blanche qui autorise l'accès entre domaines ou la définir directement pour autoriser tous les accès entre domaines. Pour une configuration spécifique, veuillez consulter les instructions de leur page github.
Pour plus d'articles liés à l'application Django de Python résolvant l'accès inter-domaines AJAX, veuillez prêter attention au site Web PHP chinois !