天天看點

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

作者:授客

QQ:1033553122

全國軟體測試QQ交流群:7156436

Git位址:https://gitee.com/ishouke

友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!

作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!

           微信打賞                       

支付寶打賞                  全國軟體測試交流QQ群  

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