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.mzph.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;生成固化的 “决策模型…