Flask解决跨域请求问题

发布于 2020-10-20  581 次阅读


笔者在Python爬虫爬取职位信息的过程中,使用的web框架为flask,在实验过程中发现请求已经返回成功,但是却无法在页面中显示出结果
在这里插入图片描述

通过浏览器的控制台发现是因为由于出现了由于跨域请求安全问题导致被浏览器拦截了。
在这里插入图片描述

跨域请求原理:

​ 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

举个例子:假如一个域名为a.com的网站,它发起一个资源路径为a.com/addUser的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为http,端口号默认为80)。但是,如果发起一个资源路径为b.cn/addUser`的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制。

解决办法:

​ 使用跨源资源共享 Cross-Origin Resource Sharing(CORS) 进行处理。跨源资源共享 Cross-Origin Resource Sharing(CORS) 是一个新的 W3C 标准,它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制。这是解决跨域问题的其中一个办法,更多办法请自行百度。

另外,规范也要求对于非简单请求,浏览器必须首先使用 OPTION 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求,在服务器确定允许后,才发起实际的HTTP请求。对于简单请求、非简单请求以及预检请求的详细资料可以阅读跨资源共享

​ 具体步骤为:
(1)安装flask-core:

pip install flask-cors

(2)在flask的控制器启动类中导入CORS即可。

from flask import Flask, request
from flask_cors import *
app = Flask(__name__)
# 解决跨域请求资源被拦截问题
CORS(app, supports_credentials=True, resources=r"/*")

繁华落尽,雪花漫天飞舞。