Python全栈之路-Django(十七)
1 JSONP原理剖析
解决浏览器对ajax存在同源策略,但是对script的src属性不限制
开发需求:向其他网站发送Http请求获取数据
- 浏览器直接发送请求(考虑同源)
- 服务器代替用户发送请求(不考虑同源)
1.1 JSONP要求:
- 客户端
URL?callback=xxx
function xxx(arg){}
- 服务端
获取funcname = request.GET.get(callback)
返回funcname(...)
1.2 JSONP使用
1.自己写动态创建script
function getUsers(){
var tag = document.createElement('script');
tag.src = 'http://www.s4.com:8001/users/?callback=list';
document.head.appendChild(tag);
}
2.jQuery
$.ajax({
url: 'http://www.s4.com:8001/users/',
type: 'GET',
dataType: 'JSONP',
jsonp: 'funcname',
jsonpCallback: 'bbb'
})
1.3 JSONP总结
- 只能发GET请求
- 约定
JSONP是一种方式,目的解决跨域问题
2 CORS
简单请求:
def new_users(request):
obj = HttpResponse('返回内容')
obj['Access-Control-Allow-Origin'] = "*"
return obj
复杂请求:
def new_users(request):
if request.method == "OPTIONS":
obj = HttpResponse()
obj['Access-Control-Allow-Origin'] = "*"
obj['Access-Control-Allow-Methods'] = "DELETE"
return obj
obj = HttpResponse('asdfasdf')
obj['Access-Control-Allow-Origin'] = "*"
return obj
其他:CORS可以处理任何请求,JSONP只能处理GET请求