同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能都會受到影響。能夠說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現django
請求的url地址,必須與瀏覽器上的url地址處於同域上,也就是域名,端口,協議相同.json
好比:我在本地上的域名是127.0.0.1:8000,請求另一個域名:127.0.0.1:8001一段數據跨域
瀏覽器上就會報錯瀏覽器
朝一個不一樣域的url地址發送請求,瀏覽器報錯安全
CORS須要瀏覽器和服務器同時支持。目前,全部瀏覽器都支持該功能,IE瀏覽器不能低於IE10。服務器
整個CORS通訊過程,都是瀏覽器自動完成,不須要用戶參與。對於開發者來講,CORS通訊與同源的AJAX通訊沒有差異,代碼徹底同樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感受。app
所以,實現CORS通訊的關鍵是服務器。只要服務器實現了CORS接口,就能夠跨源通訊。函數
def get(self,request,*args,**kwargs): print('get請求來了') obj=HttpResponse('ok') obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000' #容許哪一個域的url地址 return obj
瀏覽器就不會報錯了post
只發一次請求url
只要同時知足如下兩大條件,就屬於簡單請求。
(1) 請求方法是如下三種方法之一: HEAD GET POST (2)HTTP的頭信息不超出如下幾種字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不一樣時知足上面兩個條件,就屬於非簡單請求。
瀏覽器對這兩種請求的處理,是不同的。
兩次請求,在發送數據以前會先發一次請求用於作「預檢」(OPTIONS請求),只有「預檢」經過後纔再發送一次請求用於數據傳輸。
這裏發的是json格式因此不符合簡單請求的要求,瀏覽器也報錯
非簡單請求第一次是發送預檢請求OPTIONS
如今須要容許經過,發送post數據
後臺views.py
def index(request): obj = HttpResponse('ok') if request.method == 'OPTIONS': # 容許請求 #請求頭任意的東西均可以 obj["Access-Control-Allow-Headers"] = "*" obj['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' # 容許哪一個域的url地址 return obj
寫在視圖函數裏面不合適,應該寫在中間件裏,在應用目錄下新建一個py文件,若是不知道中間件繼承的是誰,能夠複製一條中間件改成
from django.middleware.security import SecurityMiddleware
點進SecurityMiddleware裏面看一下就知道了
from django.utils.deprecation import MiddlewareMixin class CorsMiddle(MiddlewareMixin): def process_response(self, request, response): if request.method == 'OPTIONS': response["Access-Control-Allow-Headers"] = "*" response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' # 容許哪一個域的url地址 return response
記得在settings裏面註冊中間件
MIDDLEWARE = [ 'app01.middle.CorsMiddle', ]
之後就能夠把本身寫的中間件放到別的項目裏面用