Django 跨域訪問POST請求需預先發送option請求問題處理方案
跨域訪問POST請求需預先發送option請求問題處理方案
By:授客 QQ:103355122
實踐環境
Win 10
Python 3.5.4
Django-2.0.13.tar.gz
官方下載地址:
https://www.djangoproject.com/download/2.0.13/tarball/
問題描述
使用POST請求訪問Django後端API時自動先發送option請求,然後才執行POST請求
原因分析
跨域資源共享(CORS)機制導致。
瀏覽器將CORS請求分成兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
只要同時滿足以下兩大條件,就屬於簡單請求,否則就是非簡單請求。
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)
當請求存在跨域資源共享(CORS),並且是非簡單請求,就會觸發CORS的預檢請求(preflight);"預檢"請求用的請求方法是OPTIONS,如果請求OK,才會再次傳送目標操作請求。
實際開發過程中,後臺採用token檢驗機制,前臺傳送請求必須將token放到Request Header中,那麼就需要傳輸自定義Header資訊、或則請求頭中的Content-Type設定為"application/json",就會形成非簡單請求。 但是很多時候,我們並不希望瀏覽器這麼做,重複的請求,一方面是增加伺服器壓力,另一方面,相當於增加了請求響應時間。
解決方法
一種比較合適的解決方法就是增加響應頭“Access-Control-Max-Age”來控制瀏覽器在多長時間內(單位為秒)無需在請求時傳送預檢請求,從而減少不必要的預檢請求。
中介軟體程式碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = '授客' from django.utils.deprecation import MiddlewareMixin class PublicAccessControlMiddleware(MiddlewareMixin): def process_request(self, request): pass def process_response(self, request, response): response['Access-Control-Max-Age'] = 86400 #3600*24h = 86400秒,即告訴瀏覽器,快取預檢結果24小時,即針對同一URL請求,傳送第一個OPTION請求往後24小時內不再發送OPTION請求。 return response
參考連結
https://juejin.im/post/5c889e136fb9a049d37ff768