09.07 Flask與Ajax前後端交互的跨域訪問問題

Flask與Ajax前後端交互的跨域訪問問題

一行代碼5毛錢o(∩_∩)o


在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'

問題解決!


分享到:


相關文章: