尝试使用Tauri2+Django+React项目(2)

news2025/3/29 8:29:26

前言

尝试使用tauri2+Django+React的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做,搞了半天

笔者看到官网,原来可以使用二进制文件,好好好

嵌入外部二进制文件 | Taurihttps://v2.tauri.app/zh-cn/develop/sidecar/

准备

根据官网,进入如下配置

1、在src-tauri目录下新建bin或者binaries

2、将manage.exe(Django打包文件)放入bin目录下,并且按照操作系统改名,笔者改的名

manage-x86_64-pc-windows-msvc。

3、在配置文件tauri.config.json中,在bundle添加值binaries/manage

  "bundle": {
    "active": true,
    "targets": "all",
    "externalBin": [
      "binaries/manage"
    ],
    "icon": [
      "icons/32x32.png",
      "icons/128x128.png",
      "icons/128x128@2x.png",
      "icons/icon.icns",
      "icons/icon.ico"
    ]
  }

4、配置许可

{
    ....

    "shell:allow-execute",
    "shell:allow-kill",
   
 }

正文

1、运行时,打开exe

2、关闭时,断开exe

思考

如何在运行项目时,打开exe?

这需要用到tauri的一个结构体Builder,,其中有个方法setup,项目运行时,就会运行其中的代码

Builder in tauri - Rusthttps://docs.rs/tauri/2.4.0/tauri/struct.Builder.html#method.setup

如何关闭项目时,关闭exe

使用build中的窗口事件on_window_event。

Builder in tauri - Rusthttps://docs.rs/tauri/2.4.0/tauri/struct.Builder.html#method.on_window_event

关键代码如下

use std::sync::{Arc, Mutex};

.........
.........


 .setup(|app| {
            let sidecar_child = Arc::new(Mutex::new(None)); // 用于存储 CommandChild 对象
            app.manage(sidecar_child.clone()); // 将 sidecar_child 存储在全局状态中

            let app_handle = app.handle().clone();
            let sidecar_command = app_handle.shell()
                .sidecar("manage")
                .unwrap()
                .args(["runserver", "--noreload"]);// 启动命令

            // 检查是否已经启动了子进程
            if sidecar_child.lock().unwrap().is_none() {
                match sidecar_command.spawn() {// 启动exe
                    Ok((mut rx, mut child)) => {
                        *sidecar_child.lock().unwrap() = Some(child); // 存储子进程
                        Ok(())
                    }
                    Err(e) => {
                        eprintln!("Failed to spawn sidecar: {}", e);
                        Err(Box::new(e))
                    }
                }
            } else {
                Ok(())
            }
        })
use tauri::WindowEvent;
.....
.... 

.on_window_event(|window, event| {
            if let WindowEvent::CloseRequested { api, .. } = event {
                // 获取 Sidecar 进程句柄
                let sidecar_child = window.state::<Arc<Mutex<Option<CommandChild>>>>();
                if let Some(mut child) = sidecar_child.lock().unwrap().take() {
                    let _ = child.kill(); // 关闭进程
                    println!("Sidecar process stopped on window close.");
                }
            }
        })

打包后,打开任务管理器

运行的发现——第一点

打开debug文件,

可以发现其中有manage.exe,如果把它删除,运行会报错。

看来上篇文章中,把manage.exe文件放到debug中,没有问题。

运行的发现——第二点

打开任务管理器,有一个进程,但是为什么会有两个,这两个都是进程,都有PID

这其实笔者感到疑惑

 

关闭运行

为什么只关掉了一个进程

对于这个问题,笔者打开了bin目录下exe,在powershell中单独打开manage.exe文件

./manage-x86_64-pc-windows-msvc.exe runserver --noreload

 查看进程

居然会有两个?,原来本就有两个,以前还没发现

如果关闭powershell

发现两个都关闭了。?????????

难道是manage.exe的问题,打包有问题吗?

笔者打开没有打包之前的后端,运行Django

python manage.py runserver 

在任务管理器中,原来有4个python 

关闭之后,都关闭了。笔者问了问deepseek

当你运行 python manage.py runserver 时,任务管理器显示有多个 Python 进程是正常现象。这是因为 Django 的开发服务器(runserver)会启动多个线程或子进程来处理请求和后台任务。

 当使用 -F 参数(打包为单个 EXE 文件)时,PyInstaller 会将程序解压缩到一个临时目录并运行。第二个进程是实际的程序,而第一个进程是用于在程序退出或崩溃后清理临时目录的守护进程

原来如此。manage.exe会打开两个进程而kill方法只关闭了一个进程

笔者搜了搜,原来是打包的原因,哈哈哈哈哈

python打包的exe运行后有两个进程_mob649e81540090的技术博客_51CTO博客https://blog.51cto.com/u_16175432/8031448Two process instance when i run "exe" which is generated by pyinstaller? · Issue #2483 · pyinstaller/pyinstallerhttps://github.com/pyinstaller/pyinstaller/issues/2483

解决这个问题

1、不打包成单个文件

打包成多个文件

pyinstaller manage.exe

 结果如下

 准备

(1)将_internal放到src-tauri目录下

(2)manage.exe放到bin目录下,并改名

(3)修改配置文件tauri.config.json的bundle

 "bundle": {
    "active": true,
    "targets": "all",
    "externalBin": [
      "binaries/manage"
    ],
    "resources":[
      "_internal"
    ],
    "icon": [
      "icons/32x32.png",
      "icons/128x128.png",
      "icons/128x128@2x.png",
      "icons/icon.icns",
      "icons/icon.ico"
    ]
  }

运行。

成功,完美,哈哈哈哈哈

2、继续使用单个文件

笔者多次尝试,发现对于打包成单个文件manage.exe的运行过程

首先,没有出现Django的文字的时候,只有一个进程

然后,当下面出现文字,就变成两个

当终结先出现的manage.exe,剩下一个运行,

访问127.0.0.1:8000,是成功的

当终结后出现的manage.exe,全部都关闭

因此,笔者有这个想法,如果在Tauri想办法关闭后面出现的线程,就可以完全关闭。

理论上,笔者觉得没有问题。

为什么不全部关了,哈哈哈哈哈

打包

Tauri打包

运行打包命令

pnpm run tauri:build

安装后,目录如下

可以运行。ok

终于完成了。

qe-present/tauri2-django-reacthttps://github.com/qe-present/tauri2-django-react

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.1 模拟专题:LeetCode 1576. 替换所有的问号

1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s&#xff0c;要求将所有 ? 替换为任意小写字母&#xff0c;使得替换后的字符串中 没有相邻的两个字符相同。 示例&#xff1a; 输入&#xff1a;s "?zs" →…

Linux安装go环境

安装一个lazydocker&#xff0c;根据文档需要先安装go环境 https://github.com/jesseduffield/lazydocker 官方文档解析 https://go.dev/doc/install 文档内容如下&#xff0c;一共三步 1.删除先前安装的go&#xff0c;解压下载的go压缩包到/usr/local目录 2.添加环境变量&…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

悟空crm v12安装好后出现 网络错误问题(已解决)

请求网址: http://wwww.aaaa.com/gateway/adminUser/queryUserNumInfo 请求方法: POST 状态代码: 502 Bad Gateway 远程地址: 101.37.79.226:9807 引荐来源网址政策: strict-origin-when-cross-origin

便携版:随时随地,高效处理 PDF 文件

PDF-XChange Editor Plus 便携版是一款功能强大且极其实用的 PDF 阅读与编辑工具。它不仅支持快速浏览 PDF 文件&#xff0c;还提供了丰富的编辑功能&#xff0c;让用户可以轻松处理 PDF 文档。经过大神优化处理&#xff0c;这款软件已经变得十分轻便&#xff0c;非常适合需要随…

【Golang】补充:占位符、转义字符、错误处理

&#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1、占位符 1.1通用占位符 %v &#xff1a;默认格式的值。适…

文件上传绕过的小点总结(4)

9.末尾点删除处理缺陷 给出源码&#xff1a; $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA,…

如何用Spring AI构建MCP Client-Server架构

现代 Web 应用正加速与大语言模型(LLMs)深度融合,构建超越传统问答场景的智能解决方案。为突破模型知识边界,增强上下文理解能力,开发者普遍采用多源数据集成策略,将 LLM 与搜索引擎、数据库、文件系统等外部资源互联。然而,异构数据源的协议差异与格式壁垒,往往导致集…

如何让WordPress不同的页面、栏目显示不同的小工具侧边栏

WooSidebars 是一款用于 WordPress 的插件,主要功能是允许用户根据不同的上下文条件(如特定页面、博客文章、分类目录或搜索结果页面等)来更改侧边栏中显示的小工具。 自定义小工具区域:用户可以轻松创建自定义的小工具区域,并将其设置为在多种条件下显示,只需点击几次即…

智慧座椅的节能效果如何?

嘿呀&#xff0c;你知道不&#xff0c;咱这叁仟智慧座椅的节能效果&#xff0c;那可是像个神秘小宇宙&#xff0c;根据不同的技术和应用场景&#xff0c;会展现出超有趣的变化哦&#xff0c;下面就给你唠唠常见的几种情况哈&#xff01; 能源回收大变身&#xff1a;有些叁仟智…

Matlab:二维绘图篇——不同坐标系下的绘图命令

目录 1.极坐标系下绘图&#xff1a;polar命令 实例——极坐标图形 实例——直角坐标与极坐标系图形 2.半对数坐标系下绘图&#xff1a;semilogx和semilogy 实例——半对数坐标系图形 3.双对数坐标系下绘图&#xff1a;loglog 实例——双对数坐标系绘图 4.双y轴坐标&…

对三维物体模型的阈值操作

对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别&#xff1f;3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下

向量数据库学习笔记(1) —— 基础概念

一、 嵌入模型 Embedding Models 嵌入模型是将复杂数据&#xff08;如文本、图像、音频等&#xff09;转换为向量表示的机器学习模型 1. 核心概念 嵌入(Embedding)&#xff1a;将高维、非结构化的数据映射到低维、稠密的向量空间 向量表示&#xff1a;输出固定长度的数值向量…

【算法】动态规划:回文子串问题、两个数组的dp

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 回文子串问题回文子串最长回文子串分割回文串 IV分割回文串 II *最长回文子序列让字符串成为回文串的最少插入次数 两个数组的dp最…

文件上传绕过的小点总结(3)

6.文件首尾加空绕过 源码给出这样的&#xff0c;发现文件名处理没有首尾去空&#xff0c;于是我们可以采用首尾加空的方式绕过。 $file_name $_FILES[upload_file][name]; $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_e…

OpenHarmony 入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)

文章大纲 引言一、AppStorage 应用全局的UI状态存储1、StorageProp和StorageLink装饰器建立联系2、StorageProp2.1、StorageProp使用规则2.2、StorageProp变量的传递/访问规则2.3、StorageProp支持的观察变化2.4、StorageProp 值初始化和更新 3、StorageLink3.1、StorageLink使…

阿里云国际站代理商:物联网设备怎样就近接入计算节点?

配置边缘计算实例 登录边缘计算控制台&#xff0c;找到已创建的边缘实例&#xff0c;点击实例名称后的“查看”。 分配OPC UA驱动到边缘实例中&#xff0c;选择OPCUA驱动&#xff0c;点击“设备列表”后的“驱动配置”&#xff0c;在弹出对话框中点击“添加通道”&#xff0c;…

目录遍历漏洞复现

1.在fofa中输入语法&#xff0c;查询目录遍历 body"SKControlKLForJson.ashx" 查询结果为&#xff1a; 2.寻找目录遍历漏洞&#xff0c;访问网站&#xff1a; 3.我们可以app目录中下载文件等等 4.我们还可以访问其他目录的一些东西

Java高频面试之集合-18

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;HashMap 是线程安全的吗&#xff1f;多线程下会有什么问题&#xff1f; HashMap 的线程安全性分析 HashMap 不是线程安全…