1.问题描述
当客户端向服务器端请求ajax服务时,如果客户端和服务器端域名不一致,就会出现跨域问题,ajax报错:No 'Access-Control-Allow-Origin' header is present on the requested 。
2.解决方式:
(1)安装flask_cors:
pip install flask_cors
app初始化的时候就加载配置,如下
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# r'/*' 是通配符,让本服务器所有的 URL 都允许跨域请求
CORS(app, resources=r'/*')
if __name__ == "__main__":
app.run()
CORS参数说明
参数 | 类型 | Head字段 | 说明 |
---|---|---|---|
resources | 字典、迭代器或字符串 | 无 | 全局配置允许跨域的API接口 |
origins | 列表、字符串或正则表达式 | Access-Control-Allow-Origin | 配置允许跨域访问的源,* 表示全部允许 |
methods | 列表、字符串 | Access-Control-Allow-Methods | 配置跨域支持的请求方式, 如:GET、POST |
expose_headers | 列表、字符串 | Access-Control-Expose-Headers | 自定义请求响应的Head信息 |
allow_headers | 列表、字符串或正则表达式 | Access-Control-Request-Headers | 配置允许跨域的请求头 |
supports_credentials | 布尔值 | Access-Control-Allow-Credentials | 是否允许请求发送cookie, false是不允许 |
max_age | 整数、字符串 | Access-Control-Max-Age | 预检请求的有效时长 |
(2)在被请求的Response header中加入header
@app.after_request
def func_res(resp):
res = make_response(resp)
res.headers['Access-Control-Allow-Origin'] = '*'
res.headers['Access-Control-Allow-Methods'] = 'GET,POST'
res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
return res
(3)改成jsonp格式(不推荐)
在ajax请求里将数据类型改成jsonp,但是在返回数据的时候需要一个回调函数读取,而且jsonp只支持get方式,即使使用post方式,在调用的时候也会变成get方式,这带来安全性上的问题,并不推荐。
$.ajax({
type:'POST',
url:'127.0.0.1:5000',
data:data,
dataType:'jsonp',//改成了jsonp格式,解决了跨域访问的问题
success:function(data){
console.log(data)
}