Flask框架踩坑之ajax跨域請求實現

2021-09-20 04:05:47 字數 2418 閱讀 3543

業務場景:

前後端分離需要對接資料介面。

介面測試是在postman做的,今天才開始和前端對接,由於這是我第一次做後端介面開發(第一次嘛,問題比較多)所以在此記錄分享我的踩坑之旅,以便能更好的理解,應用。

問題:

前端ajax請求後端介面出現跨域問題,如下圖。

翻譯:因為響應頭沒有"access-control-allow-origin",所以介面拒絕把資料返回給前端。

什麼是access-control-allow-origin?

access-control-allow-origin是html5中定義的一種解決資源跨域的策略。

瀏覽器只允許請求當前域的資源,而對其他域的資源表示不信任。那怎麼才算跨域呢?

其實說簡單點,跨域,指的就是瀏覽器不能執行其他**的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。

同源是指:協議相同,網域名稱相同,埠相同。三者同時成立才能叫同源。

瀏覽器的同源策略從它誕生的那一刻就出現了,具體是指從網域名稱a下的乙個頁面(一般是通過ajax請求)獲取網域名稱b下的乙個資源,是不被瀏覽器允許的。

跨域資源共享(cors)是瀏覽器提供的一種跨域協商機制,讓前後端協商是否可以發出跨域請求。cors新增了若干access-controll-request-*** 的頭,給客戶端宣告自己的源、要使用的頭部、用使用的請求方法;新增了若干access-controll-allow-***的頭,給服務端宣告自己支援跨域的源、頭部和方法。

url說明

是否允許通訊

同一網域名稱下

允許同一網域名稱下不同資料夾

允許同一網域名稱,不同埠

不允許同一網域名稱,不同協議

不允許網域名稱和網域名稱對應ip

不允許主域相同,子域不同

不允許同一網域名稱,不同二級網域名稱(同上)

不允許(cookie這種情況下也不允許訪問)

不同網域名稱

不允許

解決方案(從後端解決)

1.後台介面允許跨域請求

以python flask框架為例,有兩種方法。

第一種第三方外掛程式實現,只需要安裝第三方外掛程式就可以輕鬆地為所有介面新增響應頭。

pip3 install flask-cors

fromflask_corsimport*

=flask(__name__)

# r'/*' 是萬用字元,讓本伺服器所有的url 都允許跨域請求

實際上就是為介面響應頭新增了乙個access-control-allow-origin並設定值*表示所有**都可以請求。

第二種介面函式自定義新增屬性。

res.headers['access-control-allow-origin']='*'

returnres

為返回結果res屬性headers設定access-control-allow-origin值為*。只對當前介面有效。

2.利用nginx反向**

說到nginx,不得不說真的很強大,也帶來很多便利用於解決一些頭疼的難題。

server 

location /apis

}

1.由配置資訊可知,我們讓nginx監聽localhost的80埠,本地的81埠有都是經過localhost的80埠進行訪問。

2.我們特殊配置了乙個「/apis」目錄的訪問,並且對url執行了重寫,最後使以「/apis」開頭的位址都轉到「http://localhost:82」進行處理。

3.rewrite ^/apis/(.*)$ /$1 break,代表重寫攔截進來的請求,並且只能對網域名稱後邊以「/apis」開頭的起作用,例如www.a.com/apis/msg?x=1重寫。只對/apis重寫。rewrite後面的引數是乙個簡單的正則 ^/apis/(.*)$ ,$1代表正則中的第乙個(),$2代表第二個()的值,以此類推。break代表匹配乙個之後停止匹配。

總結一下,搭建乙個nginx並把相應**部署在伺服器本機,由頁面請求本網域名稱的乙個位址,轉由nginx**到目標伺服器處理後返回結果給頁面。這樣就完美解決了跨域問題。

javascript之踩坑記錄

console.log true console.log false 這個坑在於js裡的 和 的區別。1 對於string,number等基礎型別,和 是有區別的 1 不同型別間比較,之比較 轉化成同一型別後的值 看 值 是否相等,如果型別不同,其結果就是不等 2 同型別比較,直接進行 值 比較,兩...

SpringCloud之試探踩坑

一直rpc呼叫都是使用dubbo介面,近來微服務比較火?開始使用springcloud的介面,使用 feignclient的呼叫方式。註冊中心eureka,用於服務註冊和發現。介面呼叫的實質就是restful介面,通過spring內部封裝的httpclient方式請求呼叫。資料傳遞使用json格式,...

php框架symfony踩坑苦旅(1)

剛下班回來,本來不用加班,但是因為專案中用的是symfony框架,在本地開發執行起來特別慢,嚴重的影響了開發速度,氣的我想砸電腦。乙個簡單的增刪改查功能,我足足做了好幾天。要是用其他框架,我估計半天就能搞定了。我們也有其他專案用其他框架,有用yii yaf thinkphp的框架,開發速度都快。但是...