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

作者:rayzz 时间:2021-10-14 15:34:10 

这篇文章主要给大家介绍了关于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',
)

大功告成了。

来源:https://segmentfault.com/a/1190000016127466

标签:Django,ajax,跨域
0
投稿

猜你喜欢

  • MYSQL和ORACLE的一些操作区别

    2008-12-18 14:33:00
  • Django框架模型简单介绍与使用分析

    2021-04-06 02:59:19
  • 如何提高网页的维护效率

    2009-03-01 11:33:00
  • numpy中的transpose函数中具体使用方法

    2023-04-28 23:46:44
  • 在oracle 数据库查询的select 查询字段中关联其他表的方法

    2009-08-31 12:27:00
  • pycharm远程连接服务器并配置python interpreter的方法

    2023-03-21 20:36:06
  • windows 下python+numpy安装实用教程

    2022-06-26 09:52:26
  • python开发之thread实现布朗运动的方法

    2021-04-10 00:17:36
  • 详解如何用OpenCV + Python 实现人脸识别

    2021-07-07 19:22:35
  • python mqtt 客户端的实现代码实例

    2021-11-05 16:04:09
  • python中的map函数语法详解

    2021-04-29 22:07:00
  • 详解selenium + chromedriver 被反爬的解决方法

    2022-03-20 18:40:46
  • 一分钟带你掌握Python中pip的安装与使用方法

    2021-02-10 10:38:12
  • Python金融数据可视化汇总

    2023-04-12 21:27:41
  • PyTorch 如何自动计算梯度

    2023-08-13 14:44:20
  • Python自动化办公之定时发送邮件的实现

    2021-07-14 01:50:32
  • 使用ob系列函数实现PHP网站页面静态化

    2023-11-15 03:26:05
  • 全面理解javascript的caller,callee,call,apply概念

    2007-12-02 17:44:00
  • asp中最新新闻显示new图片的实现代码

    2012-11-30 20:31:42
  • 详解Python中的三器一闭

    2023-05-30 15:08:16
  • asp之家 网络编程 m.aspxhome.com