Django跨域請求問題的解決方法示例

2021-09-27 08:14:19 字數 4023 閱讀 8205

針對django中在編寫供ajax呼叫的api時碰到的跨域問題,我們來總結下python的django應用程式解決ajax跨域訪問問題的方法,其中使用github上開源分享的django-cors-headers尤其推薦

引子

使用django在伺服器端寫了乙個api,返回乙個json資料。使用ajax呼叫該api:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

點我獲取資料

但是,chrome瀏覽器提示錯誤:

1

no 'access-control-allow-origin' header is present on the requested resource.

經過一番google發現這個問題是——cors導致的。

什麼是cors?

cors(跨域資源共享,cross-origin resource sharing)是一種跨域訪問的機制,可以讓ajax實現跨域訪問。

其實,在伺服器的response header中,加入「access-control-allow-origin: *」即可支援cors,非常的簡單,apache/nginx等怎麼配置,見參考文件。

舉個例子:

以上過程就發生了跨域訪問。如果直接使用ajax來請求就會失敗,就像chrome提示的:

1

no 'access-control-allow-origin' header is present on the requested resource.

如何解決ajax跨域訪問問題?

解決跨域問題,有兩個方法:1.使用jsonp 2.使cors生效

使用jsonp方法,需要讓伺服器端放回jsonp格式的response,如django可以加jsonp相關的decorator,如:由於我不太喜歡這種方式,所以這裡略過了,可看後面的參考資料。

使用cors:這個用起來比較方便,現在大多數瀏覽器都支援了,且我web伺服器完全開放給別人呼叫,所以比較推薦cors。

1.使用jsonp

使用ajax獲取json資料時,存在跨域的限制。不過,在web頁面上呼叫js的script指令碼檔案時卻不受跨域的影響,jsonp就是利用這個來實現跨域的傳輸。因此,我們需要將ajax呼叫中的datatype從json改為jsonp(相應的api也需要支援jsonp)格式。

jsonp只能用於get請求。

2.直接修改django中的views.py檔案

修改views.py中對應api的實現函式,允許其他域通過ajax請求資料:

3.安裝django-cors-headers

這裡還有一各發現!在django中,有人開發了cors-header的middleware,只在settings.py中做一些簡單的配置即可,見:現在用起來伺服器端完全開放,開啟cors,沒有跨域煩惱,真爽!~

安裝django-cors-headers:

1

pipinstalldjango-cors-headers

在settings.py中增加:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

=(

...

'corsheaders',

...

)

...

middleware_classes=(

...

'corsheaders.middleware.corsmiddleware',

'django.middleware.common.commonmiddleware',

...

)

可以配置允許跨域訪問的白名單或者直接設定為允許所有的跨域訪問,具體的配置可以看看他們的github頁說明。

解決Django跨域請求問題

pip install django cors headers 新增應用 corsheaders 新增中介軟體 middleware corsheaders.middleware.corsmiddleware 建議加在第一行,必須在csrfviewmiddleware之前 設定全域性跨域 cors ...

django解決跨域請求的問題

pip install django cors headers.corsheaders middleware classes corsheaders.middleware.corsmiddleware django.middleware.common.commonmiddleware 注意順序 跨域...

django解決跨域請求的問題

解決方案 1.安裝django cors headers pip3 install django cors headers 2.配置settings.py檔案 corsheaders middleware classes corsheaders.middleware.corsmiddleware d...