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设计模式之单例模式实例
Apr 26 Python
如何利用Fabric自动化你的任务
Oct 20 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
Python lambda表达式用法实例分析
Dec 25 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
PyTorch加载预训练模型实例(pretrained)
Jan 17 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
python3 中使用urllib问题以及urllib详解
Aug 03 Python
Python更改pip镜像源的方法示例
Dec 01 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和ACCESS写聊天室(四)
2006/10/09 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
Javascript模板技术
2007/04/27 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
大学生自我鉴定
2013/12/16 职场文书
销售人员自我评价
2014/02/01 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
房产电话营销开场白
2015/05/29 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript