详解Django解决ajax跨域访问问题


Posted in Python onAugust 24, 2018

这篇文章主要给大家介绍了关于Django跨域请求问题解决的相关资料,文中介绍的实现方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里设置响应头,只能控制单个接口,需要的朋友可以参考下。
使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:

但是,Chrome浏览器提示错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是由于CORS导致的。

什么是CORS?

CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问。
其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的简单,apache/nginx等怎么配置,见参考文档。
举个例子:

  1. API部署在DomainA上;
  2. Ajax文件部署在DomainB上,Ajax文件会向API发送请求,返回数据;
  3. 用户通过DomainC访问DomainB的Ajax文件,请求数据

详解Django解决ajax跨域访问问题

前端打开的是'http://localhost:63343‘地址, 另一个是django服务器,打开了‘http://localhost:8000‘地址, 所以在'http://localhost:63343‘的javascript对'http://localhost:8000‘进行访问时,端口不同,属于跨域访问.

当我将前端页面放入django中后,就不会出现跨域访问的拒绝了.

几种方法:

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中做一些简单的配置即可,开启CORS,没有跨域烦恼,真爽!~

django-cors-headers

首先安装

pip install django-cors-headers

然后在settings.py里配置一番就可以

INSTALLED_APPS = [ 
  ... 
  'corsheaders', 
  ... ] 
 MIDDLEWARE_CLASSES = ( 
  ... 
  'corsheaders.middleware.CorsMiddleware', 
  'django.middleware.common.CommonMiddleware', # 注意顺序 
  ... 
 ) 
#跨域增加忽略 
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = ( '*') 
CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', ) 
CORS_ALLOW_HEADERS = ( 
'XMLHttpRequest', 
'X_FILENAME', 
'accept-encoding', 
'authorization', 
'content-type', 
'dnt',
'origin', 
'user-agent', 
'x-csrftoken', 
'x-requested-with', 
'Pragma', 
)

大功告成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python处理cookie详解
Feb 07 Python
Python实现向QQ群成员自动发邮件的方法
Nov 19 Python
Python实现的双色球生成功能示例
Dec 18 Python
python判断完全平方数的方法
Nov 13 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
在python中用url_for构造URL的方法
Jul 25 Python
python、Matlab求定积分的实现
Nov 20 Python
pytorch数据预处理错误的解决
Feb 20 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
Python面向对象之反射/自省机制实例分析
Aug 24 #Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 #Python
Python日志模块logging基本用法分析
Aug 23 #Python
Python多继承原理与用法示例
Aug 23 #Python
Python抽象和自定义类定义与用法示例
Aug 23 #Python
Python引用计数操作示例
Aug 23 #Python
python实现括号匹配的思路详解
Aug 23 #Python
You might like
一些常用的php简单命令代码集锦
2007/09/24 PHP
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python获取标准北京时间的方法
2015/03/24 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
python主线程捕获子线程的方法
2018/06/17 Python
python字典一键多值实例代码分享
2019/06/14 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
销售找工作求职信
2013/12/20 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python