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

引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:

test

点我获取数据

function showPersonInfo(){

$.getJSON(

'http://xxx/account/getuserinfo/',

{username: "abc"},

function(json) {

var html='
'+'用户名:'+json.username+'
'+'姓:'+json.first_name+'
'+'名:'+json.last_name+'
'+'邮箱'+json.email;

document.write(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页说明。

您可能感兴趣的文章:使用Python的Django框架结合jQuery实现AJAX购物车页面

Django框架利用ajax实现批量导入数据功能

Django中的Ajax

django使用ajax post数据出现403错误如何解决

django中使用jquery ajax post数据出现403错误的解决办法(两种方法)

Django框架如何使用ajax的post方法

django通过ajax发起请求返回JSON格式数据的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值