python 关于跨域问题

测试跨域问题:
1、编写一个view(jsonp)跳转到模板
2、模板使用ajax请求一个地址(do_jsonp)
3、编写一个view(do_jsonp)返回json串
4、测试,如果是同源下进行ajax请求可以获取数据,如果把请求的域名改成localhost那么就会出现一个错误,不能访问其他域名下的数据的错误

解决方案:
1、使用jsonp解决
就是通过客户端js动态创建一个script标签,里面编写一个src,src是可以访问外部资源,
这个外部资源是一个函数定义,然后本地把这个函数进行实现,就可以获取远程跨域的数据

a) 客户端编写一个动态构建script的方法:
function do_req() {
var script = window.document.createElement('script')
script.src = 'http://localhost:8000/school/do_jsonp/?callback=do_callback'
console.log(script)
document.body.appendChild(script)
}

b) 服务端编写一个view,返回一个函数定义 比如:函数名(参数)
def do_jsonp(request):
callback = request.GET.get('callback')
data = {"code": 200, 'message': 'Success!', "data": '这是测试JSONP跨域'}
response = None
if callback: # 代表是跨域请求
data = json.dumps(data)
# callback(data)
print(callback + "(" + data + ")")
response = HttpResponse(callback + "(" + data + ")", charset='utf-8')
else: # 正常请求
response = HttpResponse(json.dumps(data), content_type="application/json; charset=utf-8", charset='utf-8')
return response


c) 客户端定义一个函数的实现
function 函数名(参数){
// TODO
}

function do_callback(resp){
console.log(resp)
}


使用jQuery进行操作:使用$.getJSON()或者get(),使用get时,需要指定返回的类型是jsonp
function do_req() {
/*$.getJSON('http://localhost:8000/school/do_jsonp/?callback=?', {}, function(resp) {
console.log(resp)
})*/
$.get('http://localhost:8000/school/do_jsonp/?callback=?', {}, function(resp) {
console.log(resp)
}, 'jsonp')
}

使用jQuery获取GitHub上某个用户的粉丝,展示出来,使用jsonp直接展示:
https://api.github.com/users/schacon/followers

猜你喜欢

转载自www.cnblogs.com/Minlwen/p/10488714.html