$Django 跨域問題(同源策略) vue專案(axios跨域請求資料)
阿新 • • 發佈:2018-12-21
1 跨域問題
#同源策略 #本站的只能請求本站域名的資料
#CORS實現(跨域資源共享) #實現CORS通訊的關鍵是伺服器。只要伺服器實現了CORS介面,就可以跨源通訊。
#CORS基本流程 #1_CORS請求分成兩類:簡單請求(simple request)和非簡單請求(not-so-simple request) #2_滿足一下為簡單請求 (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 #3_簡單請求和非簡單請求的區別? 簡單請求:一次請求 非簡單請求:兩次請求,在傳送資料之前會先發一次請求用於做“預檢”,只有“預檢”通過後才再傳送一次請求用於資料傳輸。 * 關於“預檢” - 預檢請求方式:OPTIONS - “預檢”其實做檢查,檢查如果通過則允許傳輸資料,檢查不通過則不再發送真正想要傳送的訊息 - 如何“預檢” => 如果複雜請求是PUT等請求,則服務端需要設定允許某請求,否則“預檢”不通過 Access-Control-Request-Method => 如果複雜請求設定了請求頭,則服務端需要設定允許某請求頭,否則“預檢”不通過 Access-Control-Request-Headers
#view區域性 def test(request): ret=HttpResponse('ok') #允許http://127.0.0.1:8001域向我發請求 ret['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' ifdjango中的cors(view設定以及中介軟體設定)request.method == 'OPTIONS': # 所有的頭資訊都允許 ret['Access-Control-Allow-Headers'] = '*' return ret #設定中介軟體(全域性) class xxx(MiddlewareMixin): def process_response (self, request, response): # 簡單請求: # 允許http://127.0.0.1:8001域向我發請求 # ret['Access-Control-Allow-Origin']='http://127.0.0.1:8001' # 允許所有域向我發請求 response['Access-Control-Allow-Origin'] = '*' if request.method == 'OPTIONS': # 所有的頭資訊都允許 response['Access-Control-Allow-Headers'] = '*' return response
注意點1:有個csrf跨域防偽(允許別的域訪問的 域 要把csrf中介軟體注掉 | 檢視全部繼承apiview,as_view 返回了 csrf_exempt(view) )
2 axios跨域請求資料