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 models

class 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, FlowEdge

class FlowNodeSerializer(serializers.ModelSerializer):
    class Meta:
        model = FlowNode
        fields = ['node_id', 'type', 'position_x', 'position_y', 'data']

class FlowEdgeSerializer(serializers.ModelSerializer):
    class Meta:
        model = FlowEdge
        fields = ['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, FlowEdgeSerializer

class 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 FlowDataAPI

urlpatterns = [
    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 人工智能平台

相关推荐
神秘敲码人3 小时前
Django基础(二)Django 项目基础操作
数据库·笔记·django
程序员Bears3 小时前
电商后台管理系统:Django Admin深度定制实战指南
数据库·django·sqlite
神秘敲码人3 小时前
Django基础(一)MVT 模式与 Django 框架
笔记·python·django
Q_Q19632884758 小时前
python宠物用品商城系统
开发语言·spring boot·python·django·flask·node.js·php
STONE_KKK10 小时前
Django快速入门篇
数据库·django·sqlite
blues_C13 小时前
二、【环境搭建篇】:Django 和 Vue3 开发环境准备
后端·python·django·vue3·测试平台
Python智慧行囊13 小时前
深入解析 HTTP 中的 GET 请求与 POST 请求
django
Murphy_lx13 小时前
django回忆录(Python的一些基本概念, pycharm和Anaconda的配置, 以及配合MySQL实现基础功能, 适合初学者了解)
后端·python·pycharm·django
Python智慧行囊1 天前
Python Django 的 ORM 编程思想及使用步骤
数据库·python·django·orm