Python的Django应用程序解决AJAX跨域访问问题的方法

作者:wwt 时间:2023-08-07 16:00:24 

引子
使用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实现跨域访问。
其实,在服务器的response header中,加入“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格式的response,如Django可以加jsonp相关的decorator,如:https://coderwall.com/p/k8vb_a/returning-json-jsonp-from-a-django-view-with-a-little-decorator-help由于我不太喜欢这种方式,所以这里略过了,可看后面的参考资料。
使用CORS:这个用起来比较方便,现在大多数浏览器都支持了,且我web服务器完全开放给别人调用,所以比较推荐CORS。
1.使用JSONP
使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。
JSONP只能用于GET请求。

2.直接修改Django中的views.py文件
修改views.py中对应API的实现函数,允许其他域通过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.安装django-cors-headers
这里还有一各发现!在Django中,有人开发了CORS-header的middleware,只在settings.py中做一些简单的配置即可,见:https://github.com/ottoyiu/django-cors-headers/现在用起来服务器端完全开放,开启CORS,没有跨域烦恼,真爽!~
安装django-cors-headers:


pip install django-cors-headers

在settings.py中增加:


INSTALLED_APPS = (
 ...
 'corsheaders',
 ...
)

...

MIDDLEWARE_CLASSES = (
 ...
 'corsheaders.middleware.CorsMiddleware',
 'django.middleware.common.CommonMiddleware',
 ...
)

可以配置允许跨域访问的白名单或者直接设置为允许所有的跨域访问,具体的配置可以看看他们的github页说明。

标签:Django,AJAX
0
投稿

猜你喜欢

  • python中实现k-means聚类算法详解

    2021-07-18 21:42:49
  • 下一代web:浏览器存储支持

    2008-06-11 11:50:00
  • python基础之并发编程(二)

    2023-01-16 03:10:37
  • CentOS下重置MySQL的root密码的教程

    2024-01-25 19:20:40
  • 安装dbus-python的简要教程

    2021-09-07 10:09:43
  • SQL Server数据库连接查询和子查询实战案例

    2024-01-15 02:44:21
  • Visual Studio安装git插件的方法步骤

    2022-01-09 13:15:22
  • 一篇文章入门Python生态系统(Python新手入门指导)

    2023-11-03 01:12:00
  • Python切片工具pillow用法示例

    2021-12-08 21:17:26
  • python多项式拟合之np.polyfit 和 np.polyld详解

    2022-09-12 13:32:49
  • python 字典的概念叙述和使用方法

    2021-11-08 00:42:06
  • 查看ASP详细错误提示信息的图文设置方法

    2011-02-05 11:02:00
  • Python3实现并发检验代理池地址的方法

    2023-10-14 01:03:58
  • python框架flask表单实现详解

    2022-08-23 05:34:48
  • 计算机程序设计并行计算概念及定义全面详解

    2023-02-20 22:35:59
  • MySQL如何设置某个字段的值自增

    2024-01-27 09:49:09
  • 详解vue中的computed的this指向问题

    2024-04-27 15:46:56
  • Python实现爆破ZIP文件(支持纯数字,数字+字母,密码本)

    2021-09-01 22:30:12
  • js版实现计算器功能

    2024-04-23 09:26:42
  • winxp 安装MYSQL 出现Error 1045 access denied 的解决方法

    2024-01-20 20:53:09
  • asp之家 网络编程 m.aspxhome.com