国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python的Django應用程序解決AJAX跨域訪問問題的方法

2019-11-25 16:46:17
字體:
來源:轉載
供稿:網友

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

<!DOCTYPE HTML><html><head>  <meta charset="utf-8">  <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>  <title>test</title></head><body><button onclick="showPersonInfo()">點我獲取數據</button></body><script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>  <script>    function showPersonInfo(){      $.getJSON(        'http://xxx/account/getuserinfo/',        {username: "abc"},        function(json) {          var html='<br>'+'用戶名:'+json.username+'<br>'+'姓:'+json.first_name+'<br>'+'名:'+json.last_name+'<br>'+'郵箱'+json.email;              document.write(html);        }      )    }  </script></html>

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

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等怎么配置,見參考文檔。
舉個例子:

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

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

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

如何解決Ajax跨域訪問問題?
解決跨域問題,有兩個方法:1.使用jsonp 2.使CORS生效
使用jsonp方法,需要讓服務器端放回jsonp格式的response,如Django可以加jsonp相關的decorator,如:https://coderwall.com/p/k8vb_a/returning-json-jsonp-from-a-django-view-with-a-little-decorator-help由于我不太喜歡這種方式,所以這里略過了,可看后面的參考資料。
使用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請求數據:

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/django-cors-headers/現在用起來服務器端完全開放,開啟CORS,沒有跨域煩惱,真爽!~
安裝django-cors-headers:

pip install django-cors-headers

在settings.py中增加:

INSTALLED_APPS = (  ...  'corsheaders',  ...)...MIDDLEWARE_CLASSES = (  ...  'corsheaders.middleware.CorsMiddleware',  'django.middleware.common.CommonMiddleware',  ...)

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和政县| 海城市| 托克逊县| 兴海县| 赤城县| 农安县| 镇沅| 江安县| 潞西市| 蚌埠市| 武山县| 荣昌县| 丰城市| 修文县| 花莲县| 防城港市| 德庆县| 淮安市| 黄骅市| 罗城| 上思县| 勐海县| 桃源县| 广饶县| 安图县| 麦盖提县| 岱山县| 锦州市| 郯城县| 静海县| 安宁市| 丰县| 临湘市| 竹溪县| 仁怀市| 巴东县| 高阳县| 清水县| 奉化市| 彰化市| 陇南市|