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方法 处理跨域请求(单个视图方法中)的更多相关文章

  1. JSONP方法解决跨域请求

    Ajax跨域请求的问题 跨域:跨域名, 一个域名下的文件去请求了和他不一样的域名下的资源文件(注意是请求文件,而不是数据接口),那么就会产生跨域请求,下面来写一个ajax来跨域请求的例子 <!D ...

  2. ThinkPHP 5 中AJAX跨域请求头设置方法

    最近用thinkphp做项目,在测试环境时,存在接口的测试问题.在tp官网也没能找到相关的解决方法.自已看了一下源码,有如下的解决方案. 在项目目录下面,创建common/behavior/CronR ...

  3. jQuery ajax跨域请求的解决方法

    在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...

  4. Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法

    如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable.  在实现 ...

  5. ajax本地跨域请求以及解决方法

    什么是跨域?   我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源,只要没 ...

  6. IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法

    在 IE9 下面, XMLHttpRequest 是不支持跨域请求的. IE10 的 XMLHttpRequest 支持跨域, 而 IE8, IE9 需要使用 XDomainRequest 来实现跨域 ...

  7. 关于vue-resource 跨域请求的异常处理方法

    当你启动一个vue项目时,项目会运行在一个webpack的服务上,所以此时去访问其他端口或者是其他地址时,属于跨域请求,故会报异常. has been blocked by CORS policy: ...

  8. Thinkphp5.1允许uni-app的H5跨域请求接口解决方法

    情景: uni-app使用vue框架开发混合APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好.但是不知道是vue的原因还是什么,在PH ...

  9. thinkphp封装方法添加跨域请求

    function wang_json($data){ //返回JSON数据格式到客户端,包含状态信息 header(' Content-Type:application/json; charset=u ...

随机推荐

  1. Variation Model的应用

    Variation Model的主要原理是将待检测的图像与一张标准图像作比较,找出待检测图像与标准图像(ideal image)的明显差异(也就是不良). 标准图像可以采用几张OK品的图像训练(tra ...

  2. zookeeper 分布式计数器

    分布式计数器的思路是:指定一个Zookeeper数据节点作为计数器,多个应用实例在分布式锁的控制下,通过更新该数据节点的内容来实现计数功能. Curator中封装了实现,例如 DistributedA ...

  3. zookeeper简绍

    先一句话概括下zookeeper:zookeeper可谓是目前使用最广泛的分布式组件了.其功能和职责单一,但却非常重要. zookeeper到底是什么?(技术文) 1)zookeeper实际上是yah ...

  4. SpringMVC @RequestBody请求参数在postman中的请求

    使用SpringMVC框架,controller使用参数  @RequestBody  LoginReq req   注解方式模拟http请求 需要请求header添加一个参数 设置  Header参 ...

  5. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  6. 旋转图像 · Rotate Image

    [抄题]: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...

  7. .net二纬码标签打印

    在企业开发中经常用到二纬码标签,本文详细介绍.net环境下整个二纬码解决方案. 开发环境  vs2008  DevExpress8.3  ThoughtWorks.QRCode (二纬码生成组件,高版 ...

  8. FCLK、HCLK、PCLK

    一,PLL    S3C2440 CPU主频可达400MHz,开发板上的外接晶振为12M,通过时钟控制逻辑的PLL(phase locked loop,锁相环电路)来倍频这个系统时钟.2440有两个P ...

  9. GPS原理及其应用

    第一章 绪论 GPS定位原理: 卫星轨道未知情况下,通过几个已知站点观测卫星,利用卫星信号的多普勒效应,就可以确定卫星轨道. 卫星轨道已知情况下,用户观测卫星信号,就可以确定用户的位置. 这原来是在海 ...

  10. HDU2680 Choose the best route 2017-04-12 18:47 28人阅读 评论(0) 收藏

    Choose the best route Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Othe ...