django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)
OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法。通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源。可以说这是一个探测性的方法,客户端通过该方法可以在不访问服务器上实际资源的情况下就知道处理该资源的最优方式。
既然比较少见,什么情况下会使用这个方法呢?
假设在 edx.open.com 域下发起了一个跨域的 POST 请求,期望提交数据到 api.sit.com 这个域名的服务器。
在进行发送POST请求前,会自动先发起一个 OPTIONS 请求,其请求头包含了的一些关键性字段:
OPTIONS /upload/ HTTP/1.1
Access-Control-Request-Method: POST
Access-Control-Request-Headers: accept, content-type
Origin: http://edx.open.com
...
这种场景下,客户端发起的这个 OPTIONS 可以说是一个“预请求”,用于探测后续真正需要发起的跨域 POST 请求对于服务器来说是否是安全可接受的,因为跨域提交数据对于服务器来说可能存在很大的安全问题。
请求头 Access-Control-Request-Method 用于提醒服务器在接下来的请求中将会使用什么样的方法来发起请求。
那么在服务端应该如何处理这个 OPTIONS 请求呢?
响应上面的 OPTIONS 请求时,需要添加上用于访问控制的响应头。
响应头中关键性的字段:
Access-Control-Allow-Method: POST
Access-Control-Allow-Origin: http://edx.open.com
3 Access-Control-Allow-Headers: X-CSRFToken, Content-Type
Access-Control-Allow-Method 和 Access-Control-Allow-Origin 分别告知客户端,服务器允许客户端用于跨域的方法和域名。
完整处理流程如下:
一.在视图(我定义的是类视图)中定义OPTIONS方法: def options(self, request, *args, **kwargs)/获取请求头的 Access-Control-Request-Method 和 Origin 参数
method = request.META.get('Access-Control-Allow-Method')
2 origin = request.META.get('Origin')
二.在def options(self, request, *args, **kwargs) 方法中 设置响应头信息,返回response对象
response = Response()
response['Access-Control-Allow-Method'] = method # 支持那些请求方法,可以根据实际情况配置如 "POST, GET ,OPTIONS"
response['Access-Control-Allow-Origin'] = origin # 实际操作中本人无法获取请求头中的Origin参数,所以这里我实际上是配置成了 "*",但是不建议这样操作,后续会有问题,可以根据实际情况写成固定的也可以 "完整域名"
4 response["Access-Control-Allow-Headers"] = "X-CSRFToken, Content-Type" # 如果配置接收的请求头有遗漏,当发送OPTIONS方法成功后,发送正式请求时将会在浏览器报错,可以根据浏览器中consolo的报错内容添加进去即可, 我这里需要配置的就是这两个
5 return response # OPTION方法定义完成后,还需要在正式的视图方法中的响应对象中配置一样的响应头信息,这里不再重复了,至此,该视图方法就支持跨域请求了。
# 需要留意的是,jquery发送OPTIONS请求时,默认将不会携带cookie信息,如果此时该视图需要进行登录验证(跨域请求,却要进行用户验证,这样的场景往往存在于支持单点登录功能的多个联合平台中,如天猫和淘宝), 这时就需要在发送请求时在请求头中进行相应的配置,具体这里就不细说了,想要了解 请点击这里
# 但是我参照这种方式进行配置,options请求方法返回的都是403,所以我的处理方式是在接口(使用drf插件进行接口开发,使用drf的验证功能https://www.cnblogs.com/lowmanisbusy/p/8969771.html)注明允许所有用户访问,其实就相当于不进行登录验证,允许匿名用户进行访问(笔者所进行开发的项目如果不进行设置允许用户以何种身份方式进行访问,就会抛出异常),然后让前端传递一个用户名称给我,再使用这个数据到用户表查询自己想要的用户数据,实现功能
注意:
这里的OPTION方法中应该设置响应状态码为 204 是为了告知客户端表示该响应成功了,但是该响应并没有返回任何响应体,如果状态码为 200,还得携带多余的响应体,在这种场景下是完全多余的,只会浪费流量。
三.这里只是实现了单个视图支持跨域请求,要实现全局支持跨域请求请点击: https://www.cnblogs.com/lowmanisbusy/p/9589432.html
django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)的更多相关文章
- JSONP方法解决跨域请求
Ajax跨域请求的问题 跨域:跨域名, 一个域名下的文件去请求了和他不一样的域名下的资源文件(注意是请求文件,而不是数据接口),那么就会产生跨域请求,下面来写一个ajax来跨域请求的例子 <!D ...
- ThinkPHP 5 中AJAX跨域请求头设置方法
最近用thinkphp做项目,在测试环境时,存在接口的测试问题.在tp官网也没能找到相关的解决方法.自已看了一下源码,有如下的解决方案. 在项目目录下面,创建common/behavior/CronR ...
- jQuery ajax跨域请求的解决方法
在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...
- Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法
如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable. 在实现 ...
- ajax本地跨域请求以及解决方法
什么是跨域? 我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源,只要没 ...
- IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法
在 IE9 下面, XMLHttpRequest 是不支持跨域请求的. IE10 的 XMLHttpRequest 支持跨域, 而 IE8, IE9 需要使用 XDomainRequest 来实现跨域 ...
- 关于vue-resource 跨域请求的异常处理方法
当你启动一个vue项目时,项目会运行在一个webpack的服务上,所以此时去访问其他端口或者是其他地址时,属于跨域请求,故会报异常. has been blocked by CORS policy: ...
- Thinkphp5.1允许uni-app的H5跨域请求接口解决方法
情景: uni-app使用vue框架开发混合APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好.但是不知道是vue的原因还是什么,在PH ...
- thinkphp封装方法添加跨域请求
function wang_json($data){ //返回JSON数据格式到客户端,包含状态信息 header(' Content-Type:application/json; charset=u ...
随机推荐
- eclipse报Access restriction: The type 'BASE64Decoder' is not API处理方法
今天从svn更新代码之后,由于代码中使用了BASE64Encoder 更新之后报如下错误: Access restriction: The type ‘BASE64Decoder’ is not A ...
- django 下载文件 无法正常打开
下载文件,无法正常打开,如下图 需手动加后缀名修改文件格式方可正常打开进而能得知文件内容正常如下图,给“下载”文件加上后缀即可得到正常下载的内容 问题整理:(此下载功能采用StreamHttpResp ...
- Word编写代码时输出半角引号
工具--自动更正选项--键入时自动套用格式,去掉直引号替换为弯引号.
- tensorflow笔记 :常用函数说明
常用函数说明,梯度.产生变量等 http://blog.csdn.net/c2a2o2/article/details/69061539
- python实例、类方法、静态方法
[python实例.类方法.静态方法] 参考:http://blog.163.com/yang_jianli/blog/static/161990006201122411586729/
- 如何在eclipse中添加android ADT(转)
转自: http://jingyan.baidu.com/article/b0b63dbfa9e0a74a4830701e.html 对于程序开发的学者来说,eclipse并不陌生,它为我们提供了一个 ...
- gen_empty_obj算子的作用
gen_empty_obj 算子解释: Create an empty object tuple. 其算子签名为: gen_empty_obj( : EmptyObject : : ) 那么有人要问: ...
- labview使用场景
测试测量:LABVIEW [6] 最初就是为测试测量而设计的,因而测试测量也就是现在LABVIEW最广泛的应用领域.经过多年的发展,LABVIEW在测试测量领域获得了广泛的承认.至今,大多数主流的测 ...
- Java Thread系列(五)synchronized
Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...
- 矩阵乘法np.dot()及np.multiply()以及*
转载自 https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法 1. 同线性代数中矩阵乘法的定义: np.do ...