Django应用解决跨域API调用问题

以前一个实习生做个工具时遇到了跨域调用的问题,当时没有详细地解决。前几天,在做目前的质量度量平台时,也遇到了跨域问题,我前面有一个做法是,在本地server中增加一个API,这个API的功能是远程请求一个API并解析数据,这样浏览器访问本系统时只需要调用同域名下新增加的这个API即可,不存在跨域问题。不过,这次我想直接在AngularJS中调用跨域的远程API。

解决跨域问题,有两个方法: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。
首先,CORS是什么?
Cross-Origin Resource Sharing (CORS) is a specification that enables truly open access across domain-boundaries. If you serve public content, please consider using CORS to open it up for universal JavaScript/browser access.
其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的简单,apache/nginx等怎么配置,见参考文档。

在Django中,也有人开发了CORS-header的middleware,只在settings.py中做一些简单的配置即可,见:https://github.com/ottoyiu/django-cors-headers/
现在用起来服务器端完全开放,开启CORS,没有跨域烦恼,真爽!~

参考文档:
Django的CORS header:https://github.com/ottoyiu/django-cors-headers/
W3C的CORS规范:http://www.w3.org/TR/cors/
server端CORS的配置:http://enable-cors.org/server.html
client端支持CORS:http://enable-cors.org/client.html
JQuery和AngularJS使用jsonp实现跨域:http://xunmengsj.iteye.com/blog/1881008

master

Stay hungry, stay foolish.

5 Comments

  1. 是师兄啊!我也是SCUT的,最近也在看linux虚拟化的东西,恰好来到了你的博客!!!Information Engineering应该是电信学院的吧,我恰好也是电信学院的呢!!
    向你学习!

    • 师弟好啊~ 大三都在学习这些东西了,很牛啊,后面可以继续交流~~

      • 自己做OpenStack接触到这些的,也只是入门阶段的菜鸟来着,很多地方还需努力啊,感觉找工作压力挺大的。

  2. hello, 有没有详细的解决方案, 有点没看懂这玩意怎么用。 想了解怎么配settings,还有view里面怎么写?我如果用postman测试api的话需要如何组装链接?

    • 多花点时间看吧,感觉文档也蛮好的,我还给了参考资料。另外,postman这个的使用网上资料不要太多...

发表评论

邮箱地址不会被公开。 必填项已用*标注

*