在Flask開發RESTful後端時,前端請求會遇到跨域的問題。有3種解決方法。一種是前端與後端結合使用JSONP的方式。這個這裡先不說,我們來說說直接又後端來解決的2種方式。先來說說最簡單的方式,flask_cors包解決跨域問題。
一、flask_cors包解決跨域問題
1、下載flask_cors包
pip install flask-cors
2、使用flask_cors的CORS,代碼示例
from flask_cors import *
app = Flask(__name__)
CORS(app, supports_credentials=True)
如果還有其他問題可以查看flask_cors的文檔。
二、根據原理返回對應響應頭解決跨域問題
1、前端用ajax與後臺交互,遇到了跨域訪問的問題:一直提示沒有Access-Control-Allow-Origin,那麼我們就需要在後臺返回相應的響應頭:
res = flask.make_response()
res.headers['Access-Control-Allow-Origin'] = '*'
res.headers['Access-Control-Allow-Methods'] = 'POST,GET,OPTIONS'
res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
但是在添加了上述響應頭之後,還是提示沒有Access-Control-Allow-Origin,貌似是前端沒有收到響應。查了好多辦法都沒有解決,最後發現問題所在:異步請求
ajax在與後臺通信時採用了異步請求的方式,而且貌似是在代碼裡把異步請求async改為false都沒有用,跨域的時候默認採用異步請求,在異步請求方式下,第一次‘握手’,發送的是空數據,因此data=request.data解析不了數據,導致make_response(data)沒有返回響應,這樣前端也就收不到響應頭信息了。
解決辦法:
if request.method == 'OPTIONS':
res = flask.make_response()
if request.method == 'POST':
data = request.data
data = json.loads(data)
......
res = flask.make_response(data)
res.headers['Access-Control-Allow-Origin'] = '*'
res.headers['Access-Control-Allow-Methods'] = 'POST,GET,OPTIONS'
res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
return res
另外要注意前端代碼中
data: data//data是json格式的字符串數據
具體可以採用JSON.stringify(data)來講json數據data轉換為字符串形式還有就是content-Type寫明是json格式:
Content-Type: 'application/json'
問題解決!
閱讀更多 老陳打碼 的文章