Flask框架踩坑之ajax跨域请求实现(Flask框架踩坑之ajax跨域请求实现)
Flask框架踩坑之ajax跨域请求实现
Flask框架踩坑之ajax跨域请求实现业务场景:
前后端分离需要对接数据接口。
接口测试是在postman做的,今天才开始和前端对接,由于这是我第一次做后端接口开发(第一次嘛,问题比较多)所以在此记录分享我的踩坑之旅,以便能更好的理解,应用。
问题:
前端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 |
|
from flask_cors import * app = flask(__name__) # r'/*' 是通配符,让本服务器所有的url 都允许跨域请求 cors(app, resources = r '/*' ) |
实际上就是为接口响应头添加了一个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代理到目标服务器处理后返回结果给页面。这样就完美解决了跨域问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://www.cnblogs.com/lyxdw/p/10214216.html
- thinkphp伪静态实例(thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解)
- jquery.ajax error 如何调试错误
- jquery ajax详细教程(jquery+Ajax实现简单分页条效果)
- djangoapi接口开发(Django使用AJAX调用自己写的API接口的方法)
- $.ajax的用法
- php开发技巧和方法(php+ajax实现商品对比功能示例)
- ajax特殊字符的处理
- php导出excel使用方法(PHP使用ajax的post方式下载excel文件简单示例)
- laravel实现跨域访问(使用laravel和ajax实现整个页面无刷新的操作方法)
- ajax回调函数不执行
- jqueryajax实现部分刷新(php+jQuery ajax实现的实时刷新显示数据功能示例)
- thinkphp权限认证怎么用(ThinkPHP框架结合Ajax实现用户名校验功能示例)
- laravel事件返回错误数据(laravel Validator ajax返回错误信息的方法)
- laravel设置跨域请求(解决laravel 出现ajax请求419unknown status的问题)
- laravel 前后端开发(在Laravel中实现使用AJAX动态刷新部分页面)
- php上传大文件教程(PHP实现带进度条的Ajax文件上传功能示例)
- 乾隆为何这么喜爱白塔原因是什么(乾隆为何这么喜爱白塔原因是什么)
- 逐渐消失的东北八大怪现象,进步的社会里我们遗失的是什么(逐渐消失的东北八大怪现象)
- 今日大雪,大雪养生这样做,一年都有好气色(大雪养生这样做)
- 粗盐是什么 粗盐的功效与作用(粗盐的功效与作用)
- 会 吃人 的客机 从天堂到地狱只需5分钟,图-104如何做到(会吃人的客机)
- 男人犯的错,为什么要女人来承担(为什么要女人来承担)
热门推荐
- Extjs中文乱码
- 织梦tag标签怎样添加(DEDECMS织梦模板添加301重定向跳转网址对的代码教程)
- 在谷歌浏览器中直接编辑网页
- axios调用接口(如何实现axios的自定义适配器adapter)
- mysql和explain哪个好(MySQL EXPLAIN输出列的详细解释)
- 织梦dedecms开启付费授权(去掉织梦DedeCMS列表推荐时标题被加粗的方法)
- SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法(SQL Server免费版的安装以及使用SQL Server Management StudioSSMS连接数据库的图文方法)
- 关系数据库中的范式
- phpsession怎么用(PHP实现提高SESSION响应速度的几种方法详解)
- elasticsearch 索引创建过程(使用elasticsearch定时删除索引数据)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9