Flask框架踩坑之ajax跨域请求实现


Posted in Python onFebruary 22, 2019

业务场景:

前后端分离需要对接数据接口。

接口测试是在postman做的,今天才开始和前端对接,由于这是我第一次做后端接口开发(第一次嘛,问题比较多)所以在此记录分享我的踩坑之旅,以便能更好的理解,应用。

问题:

前端ajax请求后端接口出现跨域问题,如下图。

Flask框架踩坑之ajax跨域请求实现

翻译:因为响应头没有"Access-Control-Allow-Origin",所以接口拒绝把数据返回给前端。

什么是Access-Control-Allow-Origin?

Access-Control-Allow-Origin是HTML5中定义的一种解决资源跨域的策略。

浏览器只允许请求当前域的资源,而对其他域的资源表示不信任。那怎么才算跨域呢?

  • 请求协议http,https的不同
  • domain的不同
  • 端口port的不同

其实说简单点,跨域,指的就是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

同源是指:协议相同,域名相同,端口相同。三者同时成立才能叫同源。

浏览器的同源策略从它诞生的那一刻就出现了,具体是指从域名A下的一个页面(一般是通过ajax请求)获取域名B下的一个资源,是不被浏览器允许的。

跨域资源共享(CORS)是浏览器提供的一种跨域协商机制,让前后端协商是否可以发出跨域请求。CORS添加了若干Access-controll-request-xxx 的头,给客户端声明自己的源、要使用的头部、用使用的请求方法;添加了若干Access-Controll-Allow-xxx的头,给服务端声明自己支持跨域的源、头部和方法。

URL 说明 是否允许通信
http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许
http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许
http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许
http://www.a.com/a.js https://www.a.com/b.js 同一域名,不同协议 不允许
http://www.a.com/a.js http://70.32.92.74/b.js 域名和域名对应ip 不允许
http://www.a.com/a.js http://script.a.com/b.js 主域相同,子域不同 不允许
http://www.a.com/a.js http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允许

解决方案(从后端解决)

1.后台接口允许跨域请求

以Python Flask框架为例,有两种方法。

第一种第三方插件实现,只需要安装第三方插件就可以轻松地为所有接口添加响应头。

pip3 install flask-cors
pip3 install flask-cors
from flask_cors import *

app = Flask(__name__)
# r'/*' 是通配符,让本服务器所有的URL 都允许跨域请求 
CORS(app, resources=r'/*')

Flask框架踩坑之ajax跨域请求实现

实际上就是为接口响应头添加了一个Access-Control-Allow-Origin并设置值*表示所有网站都可以请求。

第二种接口函数自定义添加属性。

res.headers['Access-Control-Allow-Origin'] = '*'
return res

为返回结果res属性headers设置Access-Control-Allow-Origin值为*。只对当前接口有效。

2.利用nginx反向代理

说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题。

一般来说可以用来做:静态页面的服务器、静态文件缓存服务器、网站反向代理、负载均衡服务器等等,而且实现这一切,基本只需要改改那万能的配置文件即可。

server {
    listen    80;
    server_name localhost;


location / {
      proxy_pass http://localhost:81;
      proxy_redirect default;
    }

		location /apis { #添加访问目录为/apis的代理配置

			rewrite ^/apis/(.*)$ /$1 break;
			proxy_pass  http://localhost:82;
    }
}

1.由配置信息可知,我们让nginx监听localhost的80端口,本地的81端口有都是经过localhost的80端口进行访问。

2.我们特殊配置了一个“/apis”目录的访问,并且对url执行了重写,最后使以“/apis”开头的地址都转到“http://localhost:82”进行处理。

3.rewrite ^/apis/(.*)$ /$1 break,代表重写拦截进来的请求,并且只能对域名后边以“/apis”开头的起作用,例如www.a.com/apis/msg?x=1重写。只对/apis重写。rewrite后面的参数是一个简单的正则 ^/apis/(.*)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推。break代表匹配一个之后停止匹配。

总结一下,搭建一个nginx并把相应代码部署在服务器本机,由页面请求本域名的一个地址,转由nginx代理到目标服务器处理后返回结果给页面。这样就完美解决了跨域问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
Python Django Cookie 简单用法解析
Aug 13 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
如何用PyPy让你的Python代码运行得更快
Dec 02 Python
python 基于opencv实现图像增强
Dec 23 Python
python 实现图片裁剪小工具
Feb 02 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 #Python
pandas修改DataFrame列名的实现方法
Feb 22 #Python
pyhanlp安装介绍和简单应用
Feb 22 #Python
Python3.7 dataclass使用指南小结
Feb 22 #Python
Python文件读写常见用法总结
Feb 22 #Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 #Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 #Python
You might like
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python魔法方法详解
2019/02/13 Python
Django框架视图介绍与使用详解
2019/07/18 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
学雷锋志愿服务月活动总结
2014/03/09 职场文书
党员一帮一活动总结
2014/07/08 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
实名检举信范文
2015/03/02 职场文书
小学班主任自我评价
2015/03/11 职场文书
回复函范文
2015/07/14 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python