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

 更新时间:2019年02月22日 11:52:14   作者:一杯闪光喵  
这篇文章主要介绍了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

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代理到目标服务器处理后返回结果给页面。这样就完美解决了跨域问题。

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

相关文章

  • Python基础Lists和tuple实例详解

    Python基础Lists和tuple实例详解

    这篇文章主要为大家介绍了Python基础Lists和tuple实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 基于Python实现MUI侧滑菜单a标签跳转

    基于Python实现MUI侧滑菜单a标签跳转

    这篇文章主要介绍了基于Python实现MUI侧滑菜单a标签跳转,mui最接近原生APP体验的高性能前端框架,MUI侧滑常见的场景有下拉刷新,侧滑抽屉,侧滑删除,侧滑返回以及侧滑菜单等等,下面来看看文章内容详细的介绍,需要的朋友可以参考一下
    2021-11-11
  • Python入门篇之数字

    Python入门篇之数字

    本文的主题是 Python 中的数字。会详细介绍每一种数字类型,它们适用的各种运算符, 以及用于处理数字的内建函数。在文章的末尾, 简单介绍了几个标准库中用于处理数字的模块。
    2014-10-10
  • Django博客系统注册之创建用户模块应用

    Django博客系统注册之创建用户模块应用

    本文主要介绍了Django博客系统注册之创建用户模块应用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python爬虫之Selenium中frame/iframe表单嵌套页面

    Python爬虫之Selenium中frame/iframe表单嵌套页面

    这篇文章主要介绍了Python爬虫之Selenium中frame/iframe表单嵌套页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python库skimage绘制二值图像代码实例

    Python库skimage绘制二值图像代码实例

    这篇文章主要介绍了Python库skimage绘制二值图像代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题

    解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题

    这篇文章主要介绍了解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python 下载Bing壁纸的示例

    Python 下载Bing壁纸的示例

    这篇文章主要介绍了Python 下载Bing壁纸的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-09-09
  • python爬取抖音视频的实例分析

    python爬取抖音视频的实例分析

    在本篇内容里小编给大家整理一篇关于python爬取抖音视频的实例分析的相关内容,有兴趣的朋友可以测试下实例内容。
    2021-01-01
  • python3用urllib抓取贴吧邮箱和QQ实例

    python3用urllib抓取贴吧邮箱和QQ实例

    在本篇文章里小编给大家整理了关于python3中运用urllib抓取贴吧的邮箱以及QQ的实例内容,需要的朋友们可以学习下。
    2020-03-03

最新评论