No ‘Access-Control-Allow-Origin’ header is present on the requested resource
在使用瀏覽器xmlHttpRequest去訪問自己flask搭建的網站後端的時候,出現報錯:
經過一番查找知道是資源跨域訪問問題,以前使用java spring 自動幫忙解決了這個問題,都有些忘記有這個事情要做了。
flask 解決資源跨域的方法很簡單:
但是更加重要的是其中蘊含了什麼原理,這樣不管是別人問我們,還是去面試。我們都能夠比較清楚的答出來:
瀏覽器的 same origin policy:
如果網站訪問的api的網站和自己不同源,瀏覽器一樣會幫你發送request,但是會去檢測response 的頭部,如果api網站後端返回的respnse 的頭部信息,沒有允許跨域訪問,那麼你就不能夠得到返回的信息
- 不同源的標準:
- domain 域名不一樣
- http還是https
- 端口號不一樣
Cross-Origin Resource Sharing,
跨來源資源共享。是指當瀏覽器收到 異步訪問的Response 之後,返回的頭部信息裏面Access-Control-Allow-Origin裡面的內容,如果裡面有包含現在這個發起 Request 的 Origin 的話,就會允許通過,請求者順利接收到 Response。
python-flask的解決辦法:
使用flask_cors包
安裝
pip install flask_cors
初始化的時候加載配置,這樣就可以支持跨域訪問了
from flask_cors import CORS`
app = Flask(__name__)
CORS(app, supports_credentials=True)
if __name__ == "__main__":
app.run()
對請求的Response header中加入header
@app.after_request
def af_request(resp):
"""
#請求鉤子,在所有的請求發生後執行,加入headers。
:param resp:
:return:
"""
resp = make_response(resp)
resp.headers['Access-Control-Allow-Origin'] = '*'
resp.headers['Access-Control-Allow-Methods'] = 'GET,POST'
resp.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
return resp
```