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. 实现socketChannel 通信例子

    https://blog.csdn.net/qq_33935895/article/details/79678345

  2. [ShaderStaff] Vignette Effect

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:GLSL | C 最近在看Cardboard实现,其中关于畸变的着色器代码中有加入 晕影Vignette 效果的实现,固在 ...

  3. 118. Pascal's Triangle (Array)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  4. Spring AOP底层原理

    ------------------siwuxie095                                 Spring AOP 底层原理         AOP 即 Aspect Or ...

  5. 深入理解那该死的BOM

    BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF.这个标记是可选的,因为UTF8字节没有顺序, ...

  6. bootstrop-datatime参数配置

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. ICG游戏:证明,先手不是必胜就是必败。

    简介: ICG游戏:Impartial Combinatorial Games,公平的组合游戏. 以下是定义,来自网络,可能不够严谨: 1.两名选手:2.两名选手轮流行动,每一次行动可以在有限合法操作 ...

  8. 5-青蛙的约会(ex_gcd)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:122411   Accepted: 25980 Descripti ...

  9. xshell上传下载文件(Windows、Linux)

    经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我的做法现在看来好笨好繁琐,不过也达到了目的,笨人有本方法 ...

  10. C语言时间处理

    一.简介 时间处理在编程中经常遇到,包括程序的运行时间和显示时间等.在标准C中, 日期和时间的处理包含在 time.h 的头文件中,需要使用日期和时间相关的类型的函数的话, 需要导入time.h. 二 ...