最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-27 14:26:14
文档

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

Python的Django应用程序解决AJAX跨域访问:针对Django中在编写供AJAX调用的API时碰到的跨域问题,我们来总结下Python的Django应用程序解决AJAX跨域访问问题的方法,其中使用GitHub上开源分享的django-cors-headers尤其推荐引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调
推荐度:
导读Python的Django应用程序解决AJAX跨域访问:针对Django中在编写供AJAX调用的API时碰到的跨域问题,我们来总结下Python的Django应用程序解决AJAX跨域访问问题的方法,其中使用GitHub上开源分享的django-cors-headers尤其推荐引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调

针对Django中在编写供AJAX调用的API时碰到的跨域问题,我们来总结下Python的Django应用程序解决AJAX跨域访问问题的方法,其中使用GitHub上开源分享的django-cors-headers尤其推荐

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

但是,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,如:http://www.gxlcms.com/由于我不太喜欢这种方式,所以这里略过了,可看后面的参考资料。
    使用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中做一些简单的配置即可,见:http://www.gxlcms.com/现在用起来服务器端完全开放,开启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应用程序解决AJAX跨域访问相关文章请关注PHP中文网!

    文档

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

    Python的Django应用程序解决AJAX跨域访问:针对Django中在编写供AJAX调用的API时碰到的跨域问题,我们来总结下Python的Django应用程序解决AJAX跨域访问问题的方法,其中使用GitHub上开源分享的django-cors-headers尤其推荐引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调
    推荐度:
    标签: python ajax 跨域
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top