欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年05月31日 16:26:02   作者:wwt  
針對Django中在編寫供AJAX調(diào)用的API時碰到的跨域問題,我們來總結(jié)下Python的Django應用程序解決AJAX跨域訪問問題的方法,其中使用GitHub上開源分享的django-cors-headers尤其推薦

引子
使用Django在服務器端寫了一個API,返回一個JSON數(shù)據(jù)。使用Ajax調(diào)用該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()">點我獲取數(shù)據(jù)</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.

經(jīng)過一番Google發(fā)現(xiàn)這個問題是——CORS導致的。

什么是CORS?
CORS(跨域資源共享,Cross-Origin Resource Sharing)是一種跨域訪問的機制,可以讓Ajax實現(xiàn)跨域訪問。
其實,在服務器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的簡單,apache/nginx等怎么配置,見參考文檔。
舉個例子:

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

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

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

如何解決Ajax跨域訪問問題?
解決跨域問題,有兩個方法:1.使用jsonp 2.使CORS生效
使用jsonp方法,需要讓服務器端放回jsonp格式的response,如Django可以加jsonp相關(guān)的decorator,如:https://coderwall.com/p/k8vb_a/returning-json-jsonp-from-a-django-view-with-a-little-decorator-help由于我不太喜歡這種方式,所以這里略過了,可看后面的參考資料。
使用CORS:這個用起來比較方便,現(xiàn)在大多數(shù)瀏覽器都支持了,且我web服務器完全開放給別人調(diào)用,所以比較推薦CORS。
1.使用JSONP
使用Ajax獲取json數(shù)據(jù)時,存在跨域的限制。不過,在Web頁面上調(diào)用js的script腳本文件時卻不受跨域的影響,JSONP就是利用這個來實現(xiàn)跨域的傳輸。因此,我們需要將Ajax調(diào)用中的dataType從JSON改為JSONP(相應的API也需要支持JSONP)格式。
JSONP只能用于GET請求。

2.直接修改Django中的views.py文件
修改views.py中對應API的實現(xiàn)函數(shù),允許其他域通過Ajax請求數(shù)據(jù):

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
這里還有一各發(fā)現(xiàn)!在Django中,有人開發(fā)了CORS-header的middleware,只在settings.py中做一些簡單的配置即可,見:https://github.com/ottoyiu/django-cors-headers/現(xiàn)在用起來服務器端完全開放,開啟CORS,沒有跨域煩惱,真爽!~
安裝django-cors-headers:

pip install django-cors-headers

在settings.py中增加:

INSTALLED_APPS = (
  ...
  'corsheaders',
  ...
)

...

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

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

相關(guān)文章

  • 一起來看看五條Python中的隱含特性

    一起來看看五條Python中的隱含特性

    這篇文章主要為大家詳細介紹了Python中的隱含特性,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 從0開始的Python學習016異常

    從0開始的Python學習016異常

    這篇文章主要介紹了Python異常,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • python編程-將Python程序轉(zhuǎn)化為可執(zhí)行程序[整理]

    python編程-將Python程序轉(zhuǎn)化為可執(zhí)行程序[整理]

    python編程-將Python程序轉(zhuǎn)化為可執(zhí)行程序[整理]...
    2007-04-04
  • Python實現(xiàn)一維插值方法的示例代碼

    Python實現(xiàn)一維插值方法的示例代碼

    插值主要用于物理學數(shù)學中,逼近某一確定值的方法,是通過已知的離散數(shù)據(jù)求未知數(shù)據(jù)的方法。本文將利用Python實現(xiàn)一維插值方法,需要的可以參考一下
    2022-04-04
  • Python中的類學習筆記

    Python中的類學習筆記

    這篇文章主要介紹了Python中的類學習筆記,本文是個人學習總結(jié),用實例講解了類的定義、訪問控制等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Python語法詳解之decorator裝飾器

    Python語法詳解之decorator裝飾器

    裝飾器 decorator 或者稱為包裝器,是對函數(shù)的一種包裝,今天通過本文給大家分享Python語法詳解之decorator裝飾器的相關(guān)知識,感興趣的朋友一起看看吧
    2021-10-10
  • python實現(xiàn)簡單淘寶秒殺功能

    python實現(xiàn)簡單淘寶秒殺功能

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單淘寶秒殺功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python 探針的實現(xiàn)原理

    Python 探針的實現(xiàn)原理

    本文將簡單講述一下 Python 探針的實現(xiàn)原理。 同時為了驗證這個原理,我們也會一起來實現(xiàn)一個簡單的統(tǒng)計指定函數(shù)執(zhí)行時間的探針程序。
    2016-04-04
  • python正則表達式re之compile函數(shù)解析

    python正則表達式re之compile函數(shù)解析

    這篇文章主要介紹了python正則表達式re之compile函數(shù)解析,介紹了其定義,匹配模式等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • python基礎(chǔ)教程之Filter使用方法

    python基礎(chǔ)教程之Filter使用方法

    這篇文章主要介紹了python基礎(chǔ)教程之Filter使用方法的相關(guān)資料,這里對Python Filter 進行了簡單實例詳解,需要的朋友可以參考下
    2017-01-01

最新評論