React Flow 數據持久化:Django 后端存儲與加載的最佳實踐(含詳細代碼解析)

????????在構建 React Flow 應用時,前端呈現的節點與連線構成的可視化流程只是冰山一角,其背后的數據持久化與靈活調取才是確保應用穩定運行、支持用戶數據回溯與協作的關鍵。因此,后端存儲與加載 React Flow 信息的環節,就如同整個應用的數據中樞,它不僅要高效地保存前端傳遞的復雜結構數據,還要在用戶下次訪問時精準無誤地加載還原,以保障用戶體驗的連續性與完整性。下面將Django 后端為例進行介紹,也可以換成fastapi等其它后端。

????????Django 是一款功能強大且備受歡迎的 Python Web 框架,旨在快速搭建高質量的 Web 應用。它內置了豐富的組件和工具,像自動生成的數據庫管理、用戶認證系統、表單處理等,極大地簡化了開發流程,讓開發者能專注于核心業務邏輯。

????????該框架采用了模型 - 視圖 - 控制器(MVC)架構的變體 —— 模型 - 視圖 - 模板(MVT)架構。模型層負責與數據庫交互,處理數據的存儲和讀取;視圖層決定向用戶展示哪些數據;模板層則專注于數據的呈現樣式,這種分層設計使代碼結構清晰,便于維護和擴展。

????????憑借高效的開發效率、強大的安全性保障(如防止 SQL 注入、跨站腳本攻擊等)以及出色的可擴展性,Django 在各類 Web 項目中廣泛應用,無論是小型個人博客,還是大型企業級應用,都能發揮其優勢,成為眾多開發者構建后端服務的首選框架之一。

????????Python 環境可使用Anaconda 或 Miniconda 進行安裝,相關教程較多,這里簡單介紹采用 Miniconda 的安裝方式。其安裝包下載路徑為 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/。Windows 中下載 exe 文件后直接雙擊安裝即可,安裝最后一步盡量勾選環境變量到 Path 中。 Linux 安裝步驟如下:

 下載默認環境為 Python 3.10 的版本
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh
bash Miniconda3-py310_23.1.0-1-Linux-x86_64.sh
# 一直按回車(Enter)鍵確認,倒數第3步與最后1步輸入“yes”,其他均按回車
source ~/.bashrc

????????本節示例的總體目錄結構如下所示,其中 backend 目錄存儲了全部后端文件,frontend 則存儲了前端項目。

項目結構
exp07-backend/
├── backend/          # Django項目
│   ├── flow/         # 應用目錄
│   │   ├── migrations/
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── serializers.py
│   │   ├── views.py
│   │   └── tests.py
│   ├── backend/
│   │   ├── __init__.py
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py
└── frontend/         # React項目├── src/│   └── App.js    # 包含之前的React代碼├── package.json└── public/

1?項目搭建與基礎配置

????????首先,創建項目目錄并進入,通過?pip?安裝必要的依賴庫,前提是已經創建并激活了 python 環境。

mkdir exp07-backend
cd exp07-backend
pip install django djangorestframework django-cors-headers  -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

????????使用?django-admin?命令創建 Django 項目?backend,并在項目目錄下創建應用?flow:

django-admin startproject backend
cd backend
python manage.py startapp flow

????????然后,在backend/settings.py文件中配置安裝的應用和中間件,啟用rest_framework、corsheaders和flow應用,并添加 CORS 跨域配置和 REST 框架權限配置:

INSTALLED_APPS = [...'rest_framework','corsheaders','flow.apps.FlowConfig'
]MIDDLEWARE = [...'corsheaders.middleware.CorsMiddleware',
]# 添加以下配置
CORS_ALLOW_ALL_ORIGINS = True  # 開發環境臨時配置
REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.AllowAny']
}

2?定義數據類型

????????在?flow/models.py?文件中,定義兩個模型類?FlowNode?和?FlowEdge,即數據庫表結構,分別用于存儲 React Flow 中的節點和邊的信息:

from django.db import modelsclass FlowNode(models.Model):node_id = models.CharField(max_length=255, unique=True)type = models.CharField(max_length=50)position_x = models.FloatField()position_y = models.FloatField()data = models.JSONField()def __str__(self):return f"{self.type} Node ({self.node_id})"class FlowEdge(models.Model):edge_id = models.CharField(max_length=255, unique=True)source = models.CharField(max_length=255)target = models.CharField(max_length=255)source_handle = models.CharField(max_length=50)target_handle = models.CharField(max_length=50)def __str__(self):return f"Edge {self.source}->{self.target}"

????????定義好模型后,執行數據庫遷移命令,將模型映射到數據庫表:

python manage.py makemigrations
python manage.py migrate

????????執行結果如下圖所示。

圖1 創建數據庫表

3?創建序列化器

????????在 flow/serializers.py 文件中,基于 rest_framework 的 ModelSerializer 創建FlowNodeSerializer 和 FlowEdgeSerializer,用于將模型實例轉換為 JSON 格式數據,以及將 JSON 數據反序列化為模型實例:

from rest_framework import serializers
from .models import FlowNode, FlowEdgeclass FlowNodeSerializer(serializers.ModelSerializer):class Meta:model = FlowNodefields = ['node_id', 'type', 'position_x', 'position_y', 'data']class FlowEdgeSerializer(serializers.ModelSerializer):class Meta:model = FlowEdgefields = ['edge_id','source', 'target','source_handle', 'target_handle']

4?編寫視圖

????????在?flow/views.py?文件中,創建?FlowDataAPI?視圖類,繼承自?APIView,分別實現?GET 和?POST 方法,用于處理獲取和保存 React Flow 數據的請求:

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import FlowNode, FlowEdge
from .serializers import FlowNodeSerializer, FlowEdgeSerializerclass FlowDataAPI(APIView):def get(self, request):nodes = FlowNode.objects.all()edges = FlowEdge.objects.all()node_serializer = FlowNodeSerializer(nodes, many=True)edge_serializer = FlowEdgeSerializer(edges, many=True)# 需要把node_id字段改為id返回for node in node_serializer.data:node['id'] = node['node_id']del node['node_id']return Response({'nodes': node_serializer.data,'edges': edge_serializer.data})def post(self, request):# 清除舊數據FlowNode.objects.all().delete()FlowEdge.objects.all().delete()# 保存新節點nodes_data = request.data.get('nodes', [])for node in nodes_data:FlowNode.objects.create(node_id=node['node_id'],type=node['type'],position_x=node['position_x'],position_y=node['position_y'],data=node['data'])# 保存新邊edges_data = request.data.get('edges', [])for edge in edges_data:FlowEdge.objects.create(edge_id=edge['edge_id'],source=edge['source'],target=edge['target'],source_handle=edge['source_handle'],target_handle=edge['target_handle'])return Response({'status':'success'}, status=201)

5?配置 URL 路由

????????在?backend/urls.py?文件中,配置 URL 路由,將?/api/flow-data/?路徑映射到?FlowDataAPI?視圖:

from django.contrib import admin
from django.urls import path
from flow.views import FlowDataAPIurlpatterns = [path('admin/', admin.site.urls),path('api/flow-data/', FlowDataAPI.as_view()),
]

6?啟動后端與測試

????????在backend目錄下,執行?python manage.py runserver?命令啟動 Django 后端,運行結果如下圖所示。默認后端啟動端口為 8000,也可使用 python manage.py runserver 0.0.0.0:8888 更換端口為 8888。

圖2 啟動后端

????????服務啟動后我們即可通過 curl 命令或其它 HTTP 工具或程序對 API 進行測試。發送數據(保存到后端)采用 POST 方式,成功則返回 {"status":"success"}。

curl -X POST http://localhost:8000/api/flow-data/ \-H "Content-Type: application/json" \-d '{"nodes": [{"node_id": "1","type": "inputNode","position_x": 0,"position_y": 0,"data": {"label": "輸入節點","color": "#ffcccb","value": 10}},{"node_id": "2","type": "ioNode","position_x": 200,"position_y": 0,"data": {"label": "中間節點","color": "#90EE90","value": 2}},{"node_id": "3","type": "outputNode","position_x": 400,"position_y": 0,"data": {"label": "輸出節點","color": "#87CEEB","result": 20}}],"edges": [{"edge_id": "e1-2","source": "1","target": "2","source_handle": "right","target_handle": "left"},{"edge_id": "e2-3","source": "2","target": "3","source_handle": "right","target_handle": "top"}]}'

????????獲取數據(從后端加載)命令如下。

curl http://localhost:8000/api/flow-data/

圖3 后端加載數據

????????我們也可直接在網頁瀏覽器中輸入 http://localhost:8000/api/flow-data/ 進行查看,如下圖所示。

圖4 瀏覽器查看

????????至此,基于 Django 后端的 React Flow 信息存儲與加載功能已完整實現。在實際應用中,還可以根據需求進一步優化代碼,如添加數據驗證、權限控制、日志記錄等功能。

???立即關注獲取最新動態

點擊訂閱《React Agent 開發專欄》,每周獲取智能體開發深度教程。項目代碼持續更新至React Agent 開源倉庫,歡迎 Star 獲取實時更新通知!FGAI 人工智能平臺:FGAI 人工智能平臺

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

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

相關文章

深度學習中的歸一化:提升模型性能的關鍵因素

📌 友情提示: 本文內容由銀河易創AI(https://ai.eaigx.com)創作平臺的gpt-4-turbo模型輔助完成,旨在提供技術參考與靈感啟發。文中觀點或代碼示例需結合實際情況驗證,建議讀者通過官方文檔或實踐進一步確認…

Pandas:Series和DataFrame的概念、常用屬性和方法

本文目錄: 一、Series和Dataframe的概念二、創建Series對象三、創建Dataframe對象(一)Series1.Series的常用屬性總結如下:2.Series的常用方法總結如下: (二)Dataframe1.Dataframe的常用屬性2.Da…

數據中心Overlay解決方案

文檔圍繞數據中心 Overlay 解決方案展開,指出數據中心向大集中、虛擬化、云業務演進,傳統架構存在網絡規劃復雜、彈性不足、業務擴展受限等問題。Overlay 網絡在物理網絡上構建虛擬網絡,實現名址分離、網絡與物理解耦,支持業務靈活部署。方案采用VXLAN 技術(如 SDN 控制模…

SpringBoot 項目實現操作日志的記錄(使用 AOP 注解模式)

本文是博主在做關于如何記錄用戶操作日志時做的記錄,常見的項目中難免存在一些需要記錄重要日志的部分,例如權限和角色設定,重要數據的操作等部分。 博主使用 Spring 中的 AOP 功能,結合注解的方式,對用戶操作過的一些…

以太聯 - Intellinet 閃耀臺北 SecuTech 國際安全科技應用博覽會

2025 年 5 月 7 日至 9 日,臺北 SecuTech 國際安全科技應用博覽會現場熱鬧非凡,以太聯 - Intellinet 攜旗下前沿產品與解決方案精彩亮相,成為展會上一道亮麗的風景線,吸引了眾多業內人士的目光,收獲了廣泛關注與高度認…

【華為鴻蒙電腦】首款鴻蒙電腦發布:MateBook Fold 非凡大師 MateBook Pro,擎云星河計劃啟動

文章目錄 前言一、HUAWEI MateBook Fold 非凡大師(一)非凡設計(二)非凡顯示(三)非凡科技(四)非凡系統(五)非凡體驗 二、HUAWEI MateBook Pro三、預熱&#xf…

OSA快速上手

我第一次接觸OSA,第一感覺就是龐雜,相關的文檔和資料基本都是英文,運行下示例場景,效果和效率確實很香。本文僅針對初次接觸OSA、望而卻步的朋友們進行快速運用的引導。 首先,找個安裝包,導入項目后&#…

RK3568下編譯解決未定義符號而報錯終止鏈接

現象:我從rk3568板子上導出來了一個 libsqlite3.so 然后編譯連接就會報這樣的錯誤 解決辦法有多種,以前我遇到這種情況,我都是使用sqlite3源碼從新編譯一份使用,并替換到板子上。 現在我是用另一種方法:增加編譯參數 …

LSTM-Attention混合模型:美債危機與黃金對沖效率研究

摘要:本文依托多維度量化分析框架,結合自然語言處理(NLP)技術對地緣文本的情緒挖掘,構建包含宏觀因子、風險溢價因子及技術面因子的三階定價模型,對當前黃金市場的波動特征進行歸因分析。實證結果顯示&…

Spring Boot 多參數統一加解密方案詳解:從原理到實戰

Spring Boot 多參數統一加解密方案詳解:從原理到實戰 一、前言:為什么需要參數加解密? 在現代Web開發中,數據安全傳輸是基本要求。特別是涉及敏感數據(如用戶隱私、支付信息等)時,僅靠HTTPS還不夠,我們需要對關鍵參數進行二次加密。本文將詳細介紹Spring Boot中實現多…

【css】【面試提問】css經典問題總結

第一章 CSS基礎相關提問 1.1 選擇器問題 1.1.1 選擇器優先級疑問 1. 優先級規則 內聯樣式&#xff1a;直接寫在 HTML 標簽的 style 屬性中的樣式&#xff0c;優先級最高。例如&#xff1a; <p style"color: red;">這是一段紅色文字</p>這里文字的顏…

Linux服務器配置深度學習環境(Pytorch+Anaconda極簡版)

前言&#xff1a; 最近做橫向需要使用實驗室服務器跑模型&#xff0c;之前用師兄的賬號登錄服務器跑yolo&#xff0c;3張3090一輪14秒&#xff0c;我本地一張4080laptop要40秒&#xff0c;效率還是快很多&#xff0c;&#xff08;這么算一張4080桌面版居然算力能比肩3090&#…

【嵌入式】I2S音頻接口3分鐘入門

1. I2S接口入門 I2S&#xff08;Inter-IC Sound&#xff09;是一種專門用于數字音頻數據傳輸的串行通信接口。以下是其核心要點&#xff1a; 1.1 基本概念 I2S是飛利浦公司開發的一種音頻接口標準主要用于數字音頻設備之間的數據傳輸采用串行通信方式 1.2 主要特點 支持立…

java spring -framework -mvc

工程demo&#xff1a;myapp011工程下“_05mvcboot01” model 目錄 1、Spring MVC和MVC 2、創建項目&#xff1a; 3、處理請求 4、HTTP協議 超文本傳輸協議 4.1、 HTTP和HTTPS的區別 4.2、SSL證書 4.3、請求和響應 4.3.1、請求 4.3.2、響應 5、數據的傳遞與接收 5.1、客戶端傳…

沒有屋檐的房子-038—田鼠的酷刑

秋天是收獲的季節&#xff0c;收獲之后的田野里不再是濕漉漉的。水稻此時已經了卻了此生&#xff0c;他們的后代稻谷已經被搬進了打谷場&#xff0c;被蛻變成了大米&#xff0c;住進了生產隊的糧倉然后又進入各家的糧食口袋或者米柜中。稻田里視野逐漸開闊&#xff0c;收割完水…

IntelliJ IDEA打開項目后,目錄和文件都不顯示,只顯示pom.xml,怎樣可以再顯示出來?

檢查.idea文件夾 如果項目目錄中缺少.idea文件夾&#xff0c;可能導致項目結構無法正確加載。可以嘗試刪除項目根目錄下的.idea文件夾&#xff0c;然后重新打開項目&#xff0c;IDEA會自動生成新的.idea文件夾和相關配置文件&#xff0c;從而恢復項目結構。 問題解決&#xff0…

Harmony開發 List、Grid拖動自定義排序實現

1. Harmony開發 List、Grid拖動自定義排序實現 1.1. List拖動功能 本示例基于顯式動畫、List組件實現了ListItem的上下拖動、ListItem切換以及ListItem插入的效果。 ??實現思路:List手勢拖動 @Entry @Component struct ListDragPage {@State private arr: string[] = [0, …

Jules 從私有預覽階段推向全球公測

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

ubuntu上安裝mysql

sudo apt update查看可用版本&#xff1a; apt-cache policy mysql-server返回&#xff1a; mysql-server: 已安裝&#xff1a;(無) 候選&#xff1a; 8.0.42-0ubuntu0.24.04.1 版本列表&#xff1a; 8.0.42-0ubuntu0.24.04.1 500 500 http://cn.archive.ubuntu.com/ubuntu no…

預先學習:構建智能系統的 “未雨綢繆” 之道

一、預先學習&#xff1a;訓練階段的 “模型預構建” 哲學 1.1 核心定義與生物啟發 預先學習的本質是模擬人類的 “經驗積累 - 快速決策” 機制&#xff1a;如同醫生通過大量病例總結診斷規則&#xff0c;算法在訓練階段利用全量數據提煉規律&#xff0c;生成固化的 “決策模型…