【Django】实现跨域请求
@
CORS 即 Cross Origin Resource Sharing 跨域资源共享.
跨域请求分两种:简单请求、复杂请求.
简单请求
简单请求必须满足下述条件.
HTTP方法为这三种方法之一:
HEAD、GET、POST
·
HTTP头消息不超出以下字段:
Accept、Accept-Language、Content-Language、Last-Event-ID
·
且Content-Type只能为下列类型中的某一个:
application/x-www-from-urlencoded、
multipart/form-data、
text/plain.
·
任何不满足上述要求的请求,都会被认为是复杂请求.
复杂请求会先发出一个预请求——预检,OPTIONS请求.
浏览器的同源策略
·
无法跨域就是被浏览器的同源策略限制的.
也就是说,浏览器会阻止非同源的请求.
·
那什么是非同源呢?域名或端口不同的,都属于非同源.
·
浏览器只会阻止表单以及Ajax请求的跨域,但不会阻止src请求跨域.
所以,我们的cdn、图片等src请求都是正常的.
JsonP实现跨域
JsonP跨域的原理是利用了浏览器不阻止src请求跨域来实现的.
JsonP只能实现GET请求跨域.
首先 准备我们的视图文件
from django.http import HttpResponse
from rest_framework.views import APIView class TestView(APIView):
def get(self, request):
return HttpResponse("handlerResponse('is ok')")
# 注意返回的函数以及参数的格式
然后 HTML文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>JsonP跨站请求测试</title>
</head>
<body>
<script>
// 函数名应为handlerResponse,这是一种约定俗成
function handlerResponse(data) {
alert(data)
}
</script>
<!--必须放在被执行函数的script标签的下面,否则会报错函数不存在-->
<script src="http://127.0.0.1:8000/test/"></script>
</body>
</html>
好了 我们来测试吧
可以看到,我们成功实现了跨域获取数据.
JsonP解决跨域只能发送GET请求,并且实现起来前后端交互会比较多,现在几乎已经不在使用了.
在Django中间件中添加响应头
可实现简单请求和复杂请求的跨域
第一步 准备中间件
from django.utils.deprecation import MiddlewareMixin class MyCors(MiddlewareMixin):
def process_response(self, request, response):
# 如下,等于'*'后,便可允许所有简单请求的跨域访问
response['Access-Control-Allow-Origin'] = '*' # 判断是否为复杂请求
if request.method == 'OPTIONS':
response['Access-Control-Allow-Headers'] = 'Content-Type'
response['Access-Control-Allow-Methods'] = 'PUT,PATCH,DELETE' return response
写好之后,别忘记了去注册.
第二步 视图文件
from django.http import HttpResponse
from rest_framework.views import APIView class TestView(APIView):
def get(self, request):
return HttpResponse("这是GET请求的数据")
def post(self, request):
return HttpResponse("这是POST请求的数据")
def put(self, request):
return HttpResponse("这是PUT请求的数")
第三步 HTML文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<title>test</title>
</head>
<body>
<button id="sign">点击发送跨站请求</button>
<script>
$('#sign').click(function () {
$.ajax({
url: 'http://127.0.0.1:8000/test/', // 要访问的外站
type: 'put', // 请求类型, put为复杂请求
contentType: 'application/json', // 指定为'application/json'后,将变为复杂请求
success: function (data) {
// 请求成功后将执行该函数
// data是外站发送过来的数据
alert(data)
},
});
});
</script>
</body>
</html>
测试效果如下
可见,我们实现了复杂请求的跨域,简单请求就更不用说了.
好了,就到这里吧.
【Django】实现跨域请求的更多相关文章
- django允许跨域请求配置
django允许跨域请求配置 下载corsheader pip install django-cors-headers 修改setting.py中配置 在INSTALLED_APPS中增加corshe ...
- django解决跨域请求的问题
跨域请求可以用jsonp来解决,不过今天我发现一个很好用的包:django-cors-headers 只需要简单地配置一下就可 被请求方的setting.py中的配置如下: INSTALLED_APP ...
- Django之跨域请求
同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过J ...
- Django之跨域请求同源策略
同源策略: 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过 ...
- Python django解决跨域请求的问题
解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ . ...
- django - 总结 - 跨域请求
script ->jsonp跨域 浏览器的同源策略:不能跨越网站请求信息: XMLHttpRequests遵循这个规定. 因此ajax等基于XML的都不能进行跨站请求 而我们知道img,ifra ...
- Django的跨域请求
一 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之 ...
- django 支持跨域请求配置
参考:https://www.jianshu.com/p/63fb55bee142 核心注意点:
- Django跨域请求之JSONP和CORS
现在来新建一个Django项目server01,url配置为 url(r'^getData.html$',views.get_data) 其对应的视图函数为get_data: from django. ...
- $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...
随机推荐
- Class.forName()用法详解 【转】
来源 http://blog.csdn.net/kaiwii/article/details/7405761 主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.f ...
- 洛谷P2197 nim游戏模板
Code: #include<iostream> using namespace std; int main(){ int t; cin>>t; while(t--){ int ...
- git提交的规范
- ES6学习笔记(十四)Generator函数
清明时节雨纷纷,路上行人欲断魂. 借问酒家何处有,牧童遥指杏花村. 二零一九年农历三月初一,清明节. 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说 ...
- 常用模块re模块(正则表达式)
re模块 一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中, ...
- 学习优化《机器学习与优化》中文PDF+英文PDF
正在学习机器学习中的优化处理,感觉<机器学习与优化>写得还是比较通俗易懂的,第七章特征选择我需要,特征提取:相关系数,相关比,熵和互信息..更高级的应该是文本挖掘的特征提取,比如LDA提取 ...
- Python中的引用计数法
目录 引用计数法 增量操作 计数器溢出的问题 减量操作 终结器 插入计数处理 引用计数法 增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执 ...
- [HAOI2006]旅行(并查集)
寒假填坑五十道省选题——第五道 [HAOI2006]旅行 题目描述 Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路 ...
- Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的
ToastUtil.showShort(context, R.string.connection_fail); 改成 ToastUtil.showShort(BusinesslinkApplicati ...
- Option可选值(一)
//: Playground - noun: a place where people can play import Cocoa class Person { var residence: Resi ...

