继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

python的cors跨域模块主要做了什么?

2019-11-07 09:19:182981浏览

deweizhang

1实战 · 19手记 · 4推荐
TA的实战

  hello,大家好。在当下web开发环境下,前后端分离开发是一个比较主流的架构模式。那么因为不再是模板化开发,以至于前后端有可能不在一个域下(即服务器的域名是www.a.com, 客户端域名是 www.b.com),这就造成了 浏览器跨域禁止的问题。

  实际上对于前端也有很多的跨域的解决方案。那么其中一种当下也比较主流的方式是在后端开启cors。在我们python 的 web框架中, django,flask,tornado 都有各自的cors的库来处理跨域的问题。但这些cors具体做了什么呢?我们今天依然来剖析一下

  就像我们知道的,在一次http请求中包含有headers头信息,大家都是了解的,那么在浏览器首次通过options进行访问的会后,会由浏览器返回一些header信息来判断是否允许访问,那么在后端setheader的时候添加了一些允许信息,那么他们分别都是什么呢?我们今天给大家介绍最主要的一些键值对:

'Access-Control-Allow-Origin:*'  该key是代表允许访问的域名,当前demo的value是 * 代表允许所有域名访问,这必然是一个不安全的,但在开发测试阶段可以这样配置,生产环境要格外注意

'Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE'  我们知道 http请求 基于restful 有一些方法 那么这里就是允许访问的方法,例如上边的post get options delete 等,如果我们去掉 get,那么将无法通过get方法访问该服务

'Access-Control-Allow-Headers:x-requested-with,content-type'  在options预处理的时候,如果服务器返回了这个响应头的信息,则会允许请求

‘Access-Control-Allow-Credentials: true’  当设置了该key后 才能允许 cookie被传过去,否则是传不过去的。这里也是要注意的。



我们以tornado为例,在setdefaulthaders方法定义一下内容,既可以实现不需要额外安装cors库,也可以正常跨域:

def set_default_headers(self):
  self.set_header("Access-Control-Allow-Origin",self.request.headers.get('Origin', '*'))
  self.set_header('Access-Control-Allow-Credentials', 'true')
  self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
  self.set_header('Access-Control-Allow-Headers','Content-Type, 
                   Access-Control-Allow-Origin,\
                   Access-Control-Allow-Headers, X-Requested-By,\
                   Access-Control-Allow-Methods')


  上边这个例子是一个简单的demo,大家可以根据自己的业务需求再去做额外的调整。本书记也总之在于对这些header的一些了解。如果有不清楚的地方,大家也可以自行百度google,可以得到更加清晰精准的解释。

  以上就是基于服务器端 对请求headers里添加的允许访问的限制参数,通过将response总进行setheaders,浏览器就知道本次请求是否允许访问。我介绍的这些也是比较常见或者说最为核心的一些跨域允许访问的键值对。希望对大家有所帮助。


················

欢迎关注课程:

《Django入门到进阶-更适合Python小白的系统课程》


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP