Django 跨域訪問POST請求需預先發送option請求問題處理方案

跨域訪問POST請求需預先發送option請求問題處理方案python

 

By:授客 QQ:103355122django

 

實踐環境json

Win 10後端

 

Python 3.5.4跨域

 

Django-2.0.13.tar.gz瀏覽器

官方下載地址:緩存

https://www.djangoproject.com/download/2.0.13/tarball/服務器

 

問題描述app

使用POST請求訪問Django後端API時自動先發送option請求,而後才執行POST請求post

 

緣由分析

跨域資源共享(CORS)機制致使。

 

瀏覽器將CORS請求分紅兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。

只要同時知足如下兩大條件,就屬於簡單請求,不然就是非簡單請求。

一、請求方法是如下三種方法之一:

HEAD

GET

POST  

 

二、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

相關文章
相關標籤/搜索