DRF 跨域問題

【一】說明

  • CORS(跨來源資源共享,Cross-Origin Resource Sharing)是一種瀏覽器技術的規范,旨在解決瀏覽器同源策略(Same-Origin Policy)的限制,使得Web服務可以從不同的網域(源)安全地加載資源。

(1)瀏覽器同源策略

  • 同源策略是瀏覽器的一種安全機制,用于限制在瀏覽器中加載的文檔或腳本如何與不同源(協議、域名和端口)的資源進行交互。具體來說,當一個頁面加載了來自特定源的資源后,該頁面只能與同源的資源進行交互,而無法直接訪問其他源的資源。
    • 地址:指的是域名或IP地址。
    • 端口:HTTP默認端口是80,HTTPS默認端口是443。如果端口不同,即使域名和協議相同,也視為不同源。
    • 協議:HTTP和HTTPS是兩種不同的協議,即使域名和端口相同,協議不同也視為不同源。

(2)CORS 跨域資源共享

  • CORS是一種機制,允許服務器在響應中設置一些特殊的HTTP頭部,以授權其他域名下的頁面訪問自己的資源。這樣,就可以繞過瀏覽器的同源策略限制,實現跨域資源共享。
  • CORS需要瀏覽器和服務器同時支持。對于瀏覽器來說,只要支持CORS的瀏覽器(如現代瀏覽器都支持,IE瀏覽器不能低于IE10),在發現AJAX請求跨源時,會自動添加一些附加的頭信息(如Origin字段),有時還會多出一次附加的請求(預檢請求,Preflight Request),但用戶不會有感覺。
  • 對于服務器來說,只要服務器實現了CORS接口(即在響應中設置了正確的CORS頭部),就可以允許跨源通信。具體來說,服務器會在響應頭部中添加一些CORS相關的字段,如Access-Control-Allow-Origin,來指定哪些源可以訪問該資源。

(3)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)這幾種字段。
    • 非簡單請求:不同時滿足簡單請求條件的請求都屬于非簡單請求。對于非簡單請求,瀏覽器會先發出一個預檢請求(Preflight Request),詢問服務器是否允許該跨域請求。如果服務器在預檢請求的響應中同意了該請求,瀏覽器才會發出實際的CORS請求。

【二】方法一:自定義

(1)自定義中間件

from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):def process_response(self,request,response):# options請求就是非簡單請求的預檢請求if request.method=="OPTIONS":response["Access-Control-Allow-Headers"]='Content-Type, *'  # 注意:通常不建議使用 '*',應該明確列出允許的頭response['Access-Control-Allow-Methods'] = 'GET, POST, PUT, PATCH, DELETE, OPTIONS'response['Access-Control-Max-Age'] = 86400  # 預檢請求的緩存時間(秒)response["Access-Control-Allow-Origin"] = "*" # 注意:'*' 允許所有來源,但出于安全考慮,建議使用具體的來源  return response
  • 注意
    • 在生產環境中,通常不建議將 Access-Control-Allow-Origin 設置為 *,因為這可能會降低安全性。您應該將其設置為特定的源,如 'https://example.com'
    • Access-Control-Allow-Headers 也不應設置為 *,除非您確實希望允許所有頭。通常,您應該明確列出您希望允許的頭,如 'Content-Type, X-Requested-With'

(2)添加到配置文件

MIDDLEWARE = [# ... 其他中間件 ...  '自定義中間位置.CorsMiddleWare',# ... 其他中間件 ...  
]

【三】方法二:第三方

(1)使用pip安裝

pip install django-cors-headers

(2)注冊app

  • 在Django項目的 settings.py 文件中,將 'corsheaders' 添加到 INSTALLED_APPS 列表中。
INSTALLED_APPS = (  ...  'corsheaders',  ...  
)

(3)添加到中間件

  • settings.py 文件的 MIDDLEWARE 列表中,確保 'corsheaders.middleware.CorsMiddleware' 出現在其他中間件之前,但位于 'django.middleware.security.SecurityMiddleware' 之后(如果你使用了它)。
MIDDLEWARE = [  ...  'django.middleware.security.SecurityMiddleware',  'corsheaders.middleware.CorsMiddleware',  ...  
]

(4)配置CORS設置

  • settings.py 文件中,配置CORS相關的設置。
CORS_ORIGIN_ALLOW_ALL = True  # 如果設置為True,則允許所有源進行跨域訪問  
CORS_ALLOW_METHODS = (  'DELETE',  'GET',  'OPTIONS',  'PATCH',  'POST',  'PUT',  
)  
CORS_ALLOW_HEADERS = (  'accept-encoding',  'authorization',  'content-type',  'dnt',  'origin',  'user-agent',  'x-csrftoken',  'x-requested-with',  
)  # 如果希望允許攜帶憑證(如cookies、HTTP認證及客戶端SSL證明等)的跨域請求  
# 需要設置以下兩個配置,并且CORS_ORIGIN_ALLOW_ALL 必須為False,同時指定具體的源  
# CORS_ALLOW_CREDENTIALS = True  
# CORS_ORIGIN_WHITELIST = (  
#    'http://example1.com',  
#    'http://example2.com',  
#    ...  
# )

(5)源碼簡單分析

image-20240515093139158

  • 檢查是否允許所有源
    • 如果 CORS_ORIGIN_ALLOW_ALL 設置為 True 并且 CORS_ALLOW_CREDENTIALS 沒有設置為 True(因為攜帶憑證的請求不允許使用 * 作為 Access-Control-Allow-Origin 的值),則中間件會將 Access-Control-Allow-Origin 設置為 *
  • 處理OPTIONS請求
    • 當接收到 OPTIONS 請求時(即預檢請求),中間件會根據 CORS_ALLOW_METHODSCORS_ALLOW_HEADERS 的設置來設置相應的響應頭 Access-Control-Allow-MethodsAccess-Control-Allow-Headers
  • 可以發現自定義中間件就是簡化的這部分代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12880.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

error Error: certificate has expired

用yarn命令安裝依賴的時候遇到報錯: 原因:可能是開了服務器代理訪問導致ssl安全證書失效 解決方法: 在終端輸入 yarn config set "strict-ssl" false -g yarn config set "strict-ssl" false -g 然后再安裝依賴就不…

RS2227XN功能和參數介紹及PDF資料

RS2227XN是一款模擬開關/多路復用器 品牌: RUNIC(潤石) 封裝: MSOP-10 描述: USB2.0高速模擬開關 開關電路: 雙刀雙擲(DPDT) 通道數: 2 工作電壓: 1.8V~5.5V 導通電阻(RonVCC): 10Ω 功能:模擬開關/多路復用器 USB2.0高速模擬開關 工作電壓范圍:1.8V ~ 5…

Linux運行級別介紹

unlevel 運行級別 cat /etc/inittab 0 - halt (Do NOT set initdefault to this) --關機 1 - Single user mode --單用戶(進入單用戶不需要帳號與密碼) 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多用戶(沒有網絡) 3…

Java基礎篇常見面試問題總結

文章目錄 1. 你是怎樣理解 OOP面向對象?2. 重載與重寫區別3. 接口與抽象類的區別4. 深拷貝與淺拷貝的理解5. 什么是自動拆裝箱? int和 Integer有什么區別6. 和 equals()區別7. String類 能被繼承嗎為什么用 final修飾8. final、finally、finalize區別 1. 你是怎樣理…

【C語言】6.C語言VS實用調試技巧(1)

文章目錄 1.什么是 bug2.什么是調試(debug)?3.Debug 和 Release4.VS調試快捷鍵4.1 環境準備4.2 調試快捷鍵 5.監視和內存觀察5.1 監視5.2 內存 1.什么是 bug bug現在一般是指在電腦系統或程序中,隱藏著的一些未被發現的缺陷或問題…

Git使用(3):版本管理

一、查看歷史 編寫一個java類進行測試 選擇Git -> Show Git Log查看日志。 第一次修改推送到遠程倉庫了,所以有origin(遠程倉庫地址),第二次修改只提交到本地倉庫所以沒有。 二、版本回退 1、本地回退 在要回退的版本上右鍵&a…

XLSX文件刪除了怎么找回?8個恢復方法,太實用了!

U盤作為一種便攜的存儲設備,隨之而來的數據丟失問題也讓人頭疼。尤其是當U盤中的XLSX文件(Excel 2007及以后版本的默認文件格式)被誤刪除或丟失時,如何高效找回這些數據成為了許多人關注的焦點。 本文將從XLSX文件的特性、U盤格式…

C++set關聯式容器

Cset 1. 關聯式容器 vector、list、deque、forward_list(C11)等STL容器,其底層為線性序列的數據結構,里面存儲的是元素本身,這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器,關聯式容器也是用來存儲數據的&#xff0…

深度盤點在當今經濟形勢下資深項目經理或PMO的或去或從

在當今經濟形勢下,資深項目經理(Project Manager)或項目管理辦公室(PMO)的去向和選擇受到多種因素的影響。以下是對他們可能面臨的或去或從的深度盤點: 1、發展去向 1. 深化專業領域:在經濟形勢…

Linux程序開發(一):Linux基礎入門安裝和實操手冊

Tips:"分享是快樂的源泉💧,在我的博客里,不僅有知識的海洋🌊,還有滿滿的正能量加持💪,快來和我一起分享這份快樂吧😊! 喜歡我的博客的話,記得…

CSAP_MAT_BOM_MAINTAIN 返回消息處理

CSAP_MAT_BOM_MAINTAIN是創建修改BOM的函數,但這個函數的返回參數中沒有消息返回。 需要在調用前使用函數: CALL FUNCTION CALO_INIT_APIEXPORTINGdata_reset_sign EXCEPTIONSlog_object_not_found 1log_sub_object_not_found 2other_e…

QT筆記 - QPainter 填充環形區域(甜甜圈)

以矩形為例: QPainter painter(this);// painter.setPen(Qt::blue);// painter.setFont(QFont("Arial",30));// painter.drawText(rect(),Qt::AlignCenter,"Hello Qt!!!");QRect rect QRect(50, 50, 400, 400);QRect box QRect(100, 100, 105…

TS-抽象類和靜態成員

目錄 1,抽象類1,為什么需要抽象類2,抽象成員3,設計模式-模板模式 2,靜態成員1,什么是靜態成員2,設計模式-單例模式 1,抽象類 1,為什么需要抽象類 有時,某個…

Java面試八股之Java中有哪些原子類,原理是什么

Java中有哪些原子類,原理是什么 AtomicInteger 和 AtomicLong: 用于對整數(int)和長整數(long)進行原子操作。 原理:它們內部封裝了一個整型或長整型變量,并通過使用Unsafe類提供…

HarmonyOS - 記一次HSP異常堆棧無法定位問題

問題背景 HSP混淆打包之后無法定位異常堆棧,問題堆棧為: MyModules/build/default/cache/default/defaultCompileArkTS/esmodule/release/MyModules/src/main/ets/d/r.ts:1:1 問題原因: 導致無法定位問題的原因是,混淆時開啟了代碼…

OpenHarmony 實戰開發——ArkUI容器類API介紹

容器類,顧名思義就是存儲的類,用于存儲各種數據類型的元素,并具備一系列處理數據元素的方法。在 ArkUI 開發框架中,容器類采用了類似靜態的語言來實現,并通過 NAPI 框架對外提供。通過對存儲位置以及屬性的限制&#x…

關于數據結構B+TREE 和 HASH的整理

一、BTREE BTree是一種樹數據結構,是B-Tree的變種,屬于n叉排序樹,每個節點通常有多個孩子。 BTree是和B-Tree相比,BTree的所有的數據都會出現在葉子節點上,并且葉子節點會形成一個單向鏈表,非葉子節點僅僅…

C++map容器關聯式容器

Cmap 1. 關聯式容器 vector、list、deque、forward_list(C11)等STL容器,其底層為線性序列的數據結構,里面存儲的是元素本身,這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器,關聯式容器也是用來存儲數據的&#xff0…

日期問題,

日期問題 ac代碼 #include <cstdio> #include <iostream>using namespace std;int days[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check_valid(int year, int month, int day) {if (month 0 || month > 12) return false;if (day 0) …

【開發】模型部署筆記

目錄 模型量化 模型量化 1、模型量化優點 低精度模型表示模型權重數值格式為FP16&#xff08;半精度浮點&#xff09;或者INT8&#xff08;8位定點整數&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常規精度模型則一般表示模型權重數值格式為FP32&#xff08;32位…