這篇文章主要給大家介紹了關于Django跨域請求問題解決的相關資料,文中介紹的實現方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里設置響應頭,只能控制單個接口,需要的朋友可以參考下。
使用Django在服務器端寫了一個API,返回一個JSON數據。使用Ajax調用該API:
但是,Chrome瀏覽器提示錯誤:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
這是由于CORS導致的。
什么是CORS?
CORS(跨域資源共享,Cross-Origin Resource Sharing)是一種跨域訪問的機制,可以讓Ajax實現跨域訪問。
其實,在服務器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的簡單,apache/nginx等怎么配置,見參考文檔。
舉個例子:
前端打開的是'http://localhost:63343‘地址, 另一個是django服務器,打開了‘http://localhost:8000‘地址, 所以在'http://localhost:63343‘的javascript對'http://localhost:8000‘進行訪問時,端口不同,屬于跨域訪問.
當我將前端頁面放入django中后,就不會出現跨域訪問的拒絕了.
幾種方法:
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中做一些簡單的配置即可,開啟CORS,沒有跨域煩惱,真爽!~
django-cors-headers
首先安裝
pip install django-cors-headers
然后在settings.py里配置一番就可以
INSTALLED_APPS = [ ... 'corsheaders', ... ] MIDDLEWARE_CLASSES = ( ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 注意順序 ... ) #跨域增加忽略 CORS_ALLOW_CREDENTIALS = TrueCORS_ORIGIN_ALLOW_ALL = TrueCORS_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', )
新聞熱點
疑難解答