關于前后端整合和打包成exe文件的個人的總結和思考

前言

感覺有很多東西,不知道寫什么,隨便寫點吧。

正文

前后端合并

就不說怎么開發的,就說點個人感覺重要的東西。

前端用React+Vite+axios隨便寫一個demo,用于CRUD。

后端用Django REST Framework。

設置前端打包

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'// https://vite.dev/config/
export default defineConfig({plugins: [react()],base:'./',build:{outDir:'template',assetsDir:'static',},server:{proxy:{'/api':{target:'http://localhost:8000',changeOrigin:true,rewrite:path=>path.replace(/^\/api/,'')}}}
})

如果不用一些代理工具nginx等,打包后代理沒有用了。

要么在axios中去掉

baseUrl='/api'

或者在Django的路由前加上/api,一樣,都行

后續操作

1、打包后將tempate目錄復制到Django的根目錄下

2、將vite.svg圖標放到static目錄下

3、修改settings.py文件的關鍵部分

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [BASE_DIR/'templates'],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
STATICFILES_DIRS=[BASE_DIR/'templates/static'
]

如果選擇static文件夾拿到根目錄,也行,修改一下STATICFILES_DIRS。

4、修改index.html,顯示圖標

{% load static %}
<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/svg+xml" href="{% static 'vite.svg'%}" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Vite + React</title><script type="module" crossorigin src="../static/index-CetNvwB0.js"></script><link rel="stylesheet" crossorigin href="../static/index-B7i0P6ID.css"></head><body><div id="root"></div></body>
</html>

5、修改項目的urls.py文件

from django.contrib import admin
from django.urls import path,include,re_path
from django.views.generic import TemplateViewurlpatterns = [path('admin/', admin.site.urls),path('api/book/', include('book.urls')), # 加上api前綴re_path(r'^.*$', TemplateView.as_view(template_name='index.html')), # 這里是為了解決前端路由問題
]

啟動項目。

刷新頁面,沒有問題。

如果寫成下面這種。

path('',TemplateView.as_view(template_name='index.html')),

刷新就會報錯。因為前端路由和后端路由并不是完全相同的。

比如前端路由/show,而后端只有book,book/:id等的路由,沒有/show,路由不一致。

因此,代碼如下

re_path(r'^.*$', TemplateView.as_view(template_name='index.html'))

前后端合并完成,其實這個時候,可以部署到服務器。筆者選擇打包成exe文件

打包exe文件

筆者的Django項目是Rye建立的,安裝Pyinstaller

其中pyproject.toml的腳本內容如下

[tool.rye.scripts]dev = "python manage.py runserver"
build="pyinstaller -F manage.py"
build_add_data='pyinstaller -F --add-data="./templates;templates" --add-data="./static;static" manage.py'

dev :運行項目

build_add_data:增加其他模板文件和靜態文件打包成一個exe文件

筆者依照腳本移動templates目錄下的static到根目錄,為了更好的打包。也可以不移動,修改一下腳本的路徑即可。

筆者參考了其他大佬的打包過程,可能版本發生變換,打包簡單多了,只需要增加靜態文件和模板。

Pyinstaller打包Django項目(耗時兩天 踩坑無數 記錄一下)_runtimeerror: script runserver does not exist.-CSDN博客https://blog.csdn.net/qq_40292262/article/details/117026558pyinstaller打包Django項目+避坑指南-CSDN博客https://blog.csdn.net/weixin_37934258/article/details/130216656進入到manage.py目錄下。

運行腳本

rye run build_add_data

雖然過程中有警告

但無所謂,運行成功。

完美。

后端打包,前端使用nw

在前篇文章中

在github action工作流使用nw和nw-builder打包-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146126489?spm=1001.2014.3001.5502我使用了nw,nw可以吧html頁面打包成exe

筆者有個想法

不把前后端合并,后端沒有模板和靜態文件,就提供API,把后端打包成manage.exe

然后nw運行html文件時,同時打開manage.exe。

可惜,沒完全實現,筆者實力不行

前端打包和跨域問題

筆者可能剛剛知道nw,不是很了解,筆者發現需要html文件本身能夠運行,才能使用nw。

因此,修改路由為Hash

即createHashRouter,

如果不改,運行是這樣的

修改后

沒有顯示內容,因為代理失效了

修改axios的baseUrl內容

import axios from 'axios';// 后端服務地址
const API_BASE_URL = 'http://127.0.0.1:8000/api';
const requests = axios.create({baseURL: API_BASE_URL, // 動態設置 baseURLtimeout: 5000,headers: {'Content-Type': 'application/json'}
});export default requests;

再次前端打包,運行

需要跨域,而筆者沒有使用代理工具。因此,筆者使用django-cors-headers

修改setting.py的配置

INSTALLED_APPS = [...'corsheaders', # 增加corsheaders
]
MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware', # 配置中間件...]
CORS_ALLOW_ALL_ORIGINS = True # 允許所有的源訪問

運行index.html

后端打包

不需要模板和靜態文件

rye run build

打包沒有問題,不必細說。

后端、前端、nw合并

1、將沒有模板和靜態文件的manage.exe復制在前端pubilc目錄下

2、在前端pubilc目錄下新建package.json,內容如下

{"name": "book","version": "1.0.0","main": "index.html","window": {"icon": "vite.svg"},"scripts": {"dev": "concurrently \"node ./main.js\" \"nwbuild --mode=run --glob=false ./\"","nw:build": "nwbuild --mode=build --glob=false --output=../build ."},"dependencies": {"nw": "^0.96.0","nw-builder":"^4.13.9"},"devDependencies": {"concurrently": "^6.2.1"}
}

3、新建main.js文件,這里面deepseek寫的,我希望使用js代碼運行manage.exe

其中內容如下。

const { exec } = require('child_process');
const path = require('path');// 獲取 manage.exe 的路徑
const manageExePath = path.join(__dirname, 'manage.exe');// 打印路徑以調試
console.log('manageExePath:', manageExePath);// 在 Windows 上使用 start 命令啟動 manage.exe
if (process.platform === 'win32') {exec(`start "" "${manageExePath}" runserver --noreload`, (error, stdout, stderr) => {if (error) {console.error(`啟動 manage.exe 失敗: ${error.message}`);return;}console.log(`stdout: ${stdout}`);console.error(`stderr: ${stderr}`);});
} else {// 非 Windows 系統使用 spawnconst manageProcess = spawn(manageExePath, ['ruanserver', '--noreload'], {detached: true,stdio: 'ignore'});manageProcess.unref();manageProcess.on('close', (code) => {console.log(`manage.exe 退出,代碼 ${code}`);});manageProcess.on('error', (error) => {console.error(`啟動 manage.exe 失敗: ${error.message}`);});
}

安裝依賴后,運行dev腳本,同時運行manage.exe和nw

結果如下

完美

可惜

可惜,筆者并不知道如何打包后雙擊的同時運行manage.exe,這可能需要nw的知識,以后再來。

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

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

相關文章

Android15 Camera框架中的StatusTracker

StatusTracker介紹 StatusTracker是Android15 Camera框架中用來協調Camera3各組件之間狀態轉換的類。 StatusTracker線程名&#xff1a;std::string("C3Dev-") mId "-Status" Camera3 StatusTracker工作原理 StatusTracker實現批處理&#xff08;狀態…

利用OpenResty攔截SQL注入

需求 客戶的一個老項目被相關部門檢測不安全&#xff0c;報告為sql注入。不想改代碼&#xff0c;改項目&#xff0c;所以想到利用nginx去做一些數據校驗攔截。也就是前端傳一些用于sql注入的非法字符或者數據庫的關鍵字這些&#xff0c;都給攔截掉&#xff0c;從而實現攔截sql…

警惕AI神話破滅:深度解析大模型缺陷與禁用場景指南

摘要 當前AI大模型雖展現強大能力&#xff0c;但其本質缺陷可能引發系統性風險。本文從認知鴻溝、數據困境、倫理雷區、技術瓶頸四大維度剖析大模型局限性&#xff0c;揭示醫療診斷、法律決策等8類禁用場景&#xff0c;提出可信AI建設框架與用戶防護策略。通過理論分析與實操案…

顛覆語言認知的革命!神經概率語言模型如何突破人類思維邊界?

顛覆語言認知的革命&#xff01;神經概率語言模型如何突破人類思維邊界&#xff1f; 一、傳統模型的世紀困境&#xff1a;當n-gram遇上"月光族難題" 令人震驚的案例&#xff1a;2012年Google語音識別系統將 用戶說&#xff1a;“我要還信用卡” 系統識別&#xff…

【Linux】詳談 基礎I/O

目錄 一、理解文件 狹義的理解&#xff1a; 廣義理解&#xff1a; 文件操作的歸類認知 系統角度 二、系統文件I/O 2.1 標志位的傳遞 系統級接口open ?編輯 open返回值 寫入文件 讀文件 三、文件描述符 3.1&#xff08;0 & 1 & 2&#xff09; 3.2 文件描…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA&#xff1a;檢測并消除基于GAN的真實世界超分辨率模型中的偽影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景&#xff1a; GAN-SR模型雖然…

Vue3 Pinia 符合直覺的Vue.js狀態管理庫

Pinia 符合直覺的Vue.js狀態管理庫 什么時候使用Pinia 當兩個關系非常遠的組件&#xff0c;要傳遞參數時使用Pinia組件的公共參數使用Pinia

Web Worker如何在本地使用

首先了解一下什么是Web Worker Web Worker 是一種在后臺線程中運行 JavaScript 的機制&#xff0c;允許你在不阻塞主線程的情況下執行耗時的任務。這對于保持網頁的響應性和流暢性非常重要&#xff0c;特別是在需要進行復雜計算或大量數據處理時。 主要特點 多線程&#xff1…

Javaweb后端文件上傳@value注解

文件本地存儲磁盤 阿里云oss準備工作 阿里云oss入門程序 要重啟一下idea&#xff0c;上面有cmd 阿里云oss案例集成 優化 用spring中的value注解

MAC-禁止百度網盤自動升級更新

通過終端禁用更新服務(推薦)? 此方法直接移除百度網盤的自動更新組件,無需修改系統文件。 ?步驟: ?1.關閉百度網盤后臺進程 按下 Command + Space → 輸入「活動監視器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 結束相關進程。 ?2.刪除自動更新配置文件 打開終端…

數據結構:有序表的插入

本文是我編寫的針對計算機專業考研復習《數據結構》所用資料內容選刊。主要目的在于向復習這門課程的同學說明&#xff0c;此類問題不僅僅使用順序表&#xff0c;也可以使用鏈表。并且&#xff0c;在復習中&#xff0c;兩種數據結構都要掌握。 若線性表中的數據元素相互之間可以…

DeepSeek大語言模型下幾個常用術語

昨天刷B站看到復旦趙斌老師說的一句話“科幻電影里在人腦中植入芯片或許在當下無法實現&#xff0c;但當下可以借助AI人工智能實現人類第二腦”&#xff08;大概是這個意思&#xff09; &#x1f49e;更多內容&#xff0c;可關注公眾號“ 一名程序媛 ”&#xff0c;我們一起從 …

Html5學習教程,從入門到精通, HTML5超鏈接應用的詳細語法知識點和案例代碼(18)

HTML5超鏈接應用的詳細語法知識點和案例代碼 超鏈接&#xff08;Hyperlink&#xff09;&#xff0c;也稱為躍點鏈接&#xff0c;是互聯網和文檔編輯中的一種重要概念。 超鏈接的定義 超鏈接是指從一個網頁指向一個目標的連接關系&#xff0c;這個目標可以是另一個網頁&#…

MYSQL之創建數據庫和表

創建數據庫db_ck &#xff08;下面的創建是最好的創建方法&#xff0c;如果數據庫存在也不會報錯&#xff0c;并且指定使用utf8mb4&#xff09; show databases命令可以查看所有的數據庫名&#xff0c;可以找到剛剛創建的db_ck數據庫 使用該數據庫時&#xff0c;發現里面沒有…

[pytest] 配置

這里寫目錄標題 PytestInitRun3. 根據命令行選項將不同的值傳遞給測試函數 Report1. 向測試報告標題添加信息2. 分析測試持續時間 pytest --durations33. 增量測試 - 測試步驟--junitxml{report}.xml1. testsuite1.1 在測試套件級別添加屬性節點 record_testsuite_property 2. …

Manus聯創澄清:我們并未使用MCP技術

摘要 近日&#xff0c;Manus聯創針對外界關于其產品可能涉及“沙盒越獄”的疑問進行了正式回應。公司明確表示并未使用Anthropic的MCP&#xff08;模型上下文協議&#xff09;技術&#xff0c;并強調MCP是一個旨在標準化應用程序與大型語言模型&#xff08;LLM&#xff09;之間…

初始化E9環境,安裝Sqlserver數據庫

title: 初始化E9環境,安裝Sqlserver數據庫 date: 2025-03-10 19:27:19 tags: E9SqlServer初始化E9環境,安裝Sqlserver數據庫 安裝E9本地環境安裝Sql server 數據庫1、檢查SQL Server服務是否開啟2、檢查SQL Server網絡網絡配置是否開啟創建一個ecology數據庫點擊初始化數據庫…

推薦一個基于Koin, Ktor Paging等組件的KMM Compose Multiplatform項目

Kotlin Multiplatform Mobile&#xff08;KMM&#xff09;已經從一個雄心勃勃的想法發展成為一個穩定而強大的框架&#xff0c;為開發人員提供了在多個平臺上無縫共享代碼的能力。通過最近的穩定版本里程碑&#xff0c;KMM已成為跨平臺開發領域的改變者。 環境設置 帶有Kotli…

在WSL2-Ubuntu中安裝CUDA12.8、cuDNN、Anaconda、Pytorch并驗證安裝

#記錄工作 提示&#xff1a;整個過程最好先開啟系統代理&#xff0c;也可以用鏡像源&#xff0c;確保有官方發布的最新特性和官方庫的完整和兼容性支持。 期間下載會特別慢&#xff0c;需要在系統上先開啟代理&#xff0c;然后WSL設置里打開網絡模式“Mirrored”,以設置WSL自動…

Ubuntu 24.04.2 允許 root 登錄桌面、 ssh 遠程、允許 Ubuntu 客戶機與主機拖拽傳遞文件

允許 root 登錄桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注釋掉 auth required pam_succeed_if.so user ! root quiet_success 允許 root 通過 ssh 登錄 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …