详解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和php出现中文乱码的解决方法

    2009-01-14 12:02:00
  • Django项目基础配置和基本使用过程解析

    2023-04-27 18:29:19
  • MSSQL中部分字段重复数据的删除方法

    2008-12-29 13:59:00
  • ajax Google PageRank3(PR值)查询源代码

    2007-11-04 13:31:00
  • python3对拉勾数据进行可视化分析的方法详解

    2022-04-04 03:02:32
  • python简单验证码识别的实现过程

    2021-09-12 12:40:55
  • python-xpath获取html文档的部分内容

    2022-10-06 19:41:52
  • DRF之请求与响应的实现

    2023-04-06 03:37:09
  • SqlServer将查询结果转换为XML和JSON

    2024-01-18 20:25:59
  • asp 实现的冒泡排序程序

    2011-03-25 11:13:00
  • python 如何获取文件夹中的全部文件

    2022-09-10 16:48:11
  • python 多进程和多线程使用详解

    2021-08-12 19:50:43
  • mysql实现将字符串字段转为数字排序或比大小

    2024-01-16 19:59:16
  • 基于Python的EasyGUI学习实践

    2021-09-05 10:54:55
  • CentOS下使用yum安装python-pip失败的完美解决方法

    2023-07-09 12:23:01
  • 整理关于Bootstrap表单的慕课笔记

    2024-04-16 10:27:19
  • WEB2.0网页制作标准教程(5)head区的其他设置

    2007-11-13 13:28:00
  • MySQL导入与导出备份详解

    2024-01-16 18:47:08
  • matplotlib bar()实现多组数据并列柱状图通用简便创建方法

    2022-12-11 11:59:15
  • pytorch 状态字典:state_dict使用详解

    2023-01-16 11:42:52
  • asp之家 网络编程 m.aspxhome.com