Django解決ajax跨域訪問問題

Django解決ajax跨域訪問問題

這篇文章主要給你們介紹了關於Django跨域請求問題解決的相關資料,文中介紹的實現方法包括:使用django-cors-headers全局控制、使用JsonP,只能用於Get方法以及在views.py裏設置響應頭,只能控制單個接口,須要的朋友能夠參考下。

使用Django在服務器端寫了一個API,返回一個JSON數據。使用Ajax調用該API:python

可是,Chrome瀏覽器提示錯誤:nginx

No 'Access-Control-Allow-Origin' header is present on the requested resource.

這是因爲CORS致使的。git

什麼是CORS?github

CORS(跨域資源共享,Cross-Origin Resource Sharing)是一種跨域訪問的機制,可讓Ajax實現跨域訪問。
其實,在服務器的response header中,加入「Access-Control-Allow-Origin: *」便可支持CORS,很是的簡單,apache/nginx等怎麼配置,見參考文檔。
舉個例子:ajax

  • API部署在DomainA上;
  • Ajax文件部署在DomainB上,Ajax文件會向API發送請求,返回數據;
  • 用戶經過DomainC訪問DomainB的Ajax文件,請求數據

幾種方法:apache

1.使用JSONP使用Ajax獲取json數據時,存在跨域的限制。不過,在Web頁面上調用js的script腳本文件時卻不受跨域的影響,JSONP就是利用這個來實現跨域的傳輸。所以,咱們須要將Ajax調用中的dataType從JSON改成JSONP(相應的API也須要支持JSONP)格式。
JSONP只能用於GET請求。django

2.直接修改Django中的views.py文件修改views.py中對應API的實現函數,容許其餘域經過Ajax請求數據:json

def myview(_request):  
    response = HttpResponse(json.dumps({"key": "value", "key2": "value"}))
    response["Access-Control-Allow-Origin"] = "*"  
    response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"  
    response["Access-Control-Max-Age"] = "1000"  
    response["Access-Control-Allow-Headers"] = "*"  
    return response

3.安裝django-cors-headers這裏還有一各發現!在Django中,有人開發了CORS-header的middleware,只在settings.py中作一些簡單的配置便可,見:https://github.com/ottoyiu/dj...,開啓CORS,沒有跨域煩惱,真爽!~跨域

django-cors-headers瀏覽器

首先安裝

而後在settings.py裏配置一番就能夠

INSTALLED_APPS = [  
     ...  
     'corsheaders', 
     ...  ]    
 MIDDLEWARE_CLASSES = ( 
     ...  
     #儘量靠前,必須在CsrfViewMiddleware、CommonMiddleware以前。
     #咱們直接放在第一個位置就行了
     'django.middleware.csrf.CsrfViewMiddleware',
     'corsheaders.middleware.CorsMiddleware',  
     'django.middleware.common.CommonMiddleware', 
     ... 
 ) 
添加參數爲true
CORS_ORIGIN_ALLOW_ALL = True
#下面這些能夠不用設置
#跨域增長忽略 
CORS_ALLOW_CREDENTIALS = True
#設置白名單
CORS_ORIGIN_WHITELIST = (  '*')   
CORS_ALLOW_METHODS = (  'DELETE',  'GET',  'OPTIONS',  'PATCH',  'POST',  'PUT',  'VIEW', )   
CORS_ALLOW_HEADERS = (  
'XMLHttpRequest',  
'X_FILENAME',  
'accept-encoding', 
'authorization',  
'content-type',  
'dnt',
'origin',  
'user-agent',  
'x-csrftoken',  
'x-requested-with',  
'Pragma', 
)
相關文章
相關標籤/搜索