No Access-Control-Allow-Origin header is present on the requested resource 解決跨域資源共享問題

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
    ```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章