一 前提
# Python是解释型语言,我们写的Flask或Django项目如果部署,源码可能会泄露,因此我们可以把项目打包成exe,来保护源码
# 需要用到工具
-pyinstaller:把python项目打包成不同平台的可执行文件
-nsis:NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序,它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的
二 打包Flask项目
2.1 项目源码
# 项目源代码放在百度网盘上,如果需要自取,或者自己写个Flask项目亦可
# 百度网盘地址
链接: https://pan.baidu.com/s/1eJ029dk6ENCJyPJjMLN6vA
提取码: a2qq
# 目录结构如下
2.2 下载pyinstaller
pip3 install pyinstaller
# 参数介绍
可选参数 |
示例 |
说明 |
-F |
pyinstaller -F demo.py |
只在dist文件夹中生成一个程序demo.exe文件,适用于一个模块没有多依赖.py文件 |
-D |
pyinstaller -D demo.py |
默认选项,除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用这个 |
-c |
pyinstaller -c demo.py |
默认选项,只对windows有效,使用控制台 |
-w |
pyinstaller -w demo.py |
只对windows有效,不使用控制台 |
-p |
pyinstaller -p D:\project\demo.py |
设置导入路径 |
-i |
pyinstaller -i D:\demo.ico demo.py |
给生成的demo.exe文件设置一个自定义的图标 |
2.3 进入到项目路径下,执行
# run.py 是flask项目的执行文件,app.run所在py文件
pyinstaller -D run.py
# 可以看到项目路径下有
-build文件夹
-dist文件夹:重要,下有run文件夹(py文件名字),有个run.exe(py文件的名字)
-run.spec
# 把pro_flask这个文件夹,拷贝到dist下的run文件夹
-因为flask项目有静态文件和html文件,如果不拷贝过去,静态文件和html文件会找不到
-我们为了隐藏代码,可以把所有python的代码都删除,只留static和templates文件夹
2.4 运行exe,测试
# 今日到dist/run文件夹下,双击 run.exe,启动
如下图
# 浏览器访问
如下图
2.5 使用nsis把文件夹打包成windows的安装包
2.5.1 下载安装nsis
nsis:NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序,它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的
利用 nsis 把刚刚的dist的run文件夹打包成windows的安装包
# nsis下载地址
https://nsis.sourceforge.io/Download
# 一路下一步安装,打开
如下图
2.5.2 把dist文件夹下的run文件夹压缩成zip
2.5.3 使用nsis把压缩包,做成windows安装文件
2.6 安装刚刚打包的安装包测试
# 双击 run ,打开,一路下一步
三 打包Django项目
3.1 准备django项目
# 百度网盘下载,或自己创建一个即可
链接: https://pan.baidu.com/s/1p77wF1BaJzo7baCJIl-Z1g
提取码: 51dn
# 在django项目的配置文件中修改settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')
# 修改urls.py
from django.conf.urls import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
]
urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
# 执行 静态文件收集
python manage.py collectstatic # 会把所有静态文件收集到项目的static路径下的static_root文件夹下
3.2 使用 pyinstaller打包
# 进入到项目路径下
pyinstaller -D manage.py
# 生成dist文件夹,build文件夹和manage.spec文件
3.3 执行打包成的exe
# 此时在项目路径下会生成dist文件夹,内部manage文件夹下有manage.exe
manage.exe runserver
# 运行服务是会提示No module named XXX
执行会报错,提升缺少模块,我的提示少app01.apps
#########
这是因为Django有些module不会自动收集,需要手动添加
解决方法:在manage.spec文件中修改hiddenimports=[]为hiddenimports=['app01.apps','users.apps',],提示缺少什么module就在此处添加什么。
#########
修改manage.spec,hiddenimports=['app01.apps',]
# 再重新编译一下,运行
pyinstaller manage.spec
3.4 把templates和static文件夹copy到dist/manage文件夹下
3.5 运行项目
manage.exe runserver 0.0.0.0:8080
3.6 注意一些坑
# 问题1:运行服务提示No module named XXX
这是因为Django有些module不会自动收集,需要手动添加
解决方法:在manage.spec文件中修改hiddenimports=[]为hiddenimports=['users','users.apps',],提示缺少什么module就在此处添加什么。
# 问题2:打开网页出现TemplateDoesNotExist 错误
解决方法:把项目中的模板文件templates拷贝到dist下的manage文件夹,刷新页面即可。
# 问题3:静态文件找不到
1、首先在项目中的settings文件中添加如下代码,其中static是项目中的静态文件位置,static_root是static下的一个空文件夹,然后执行python manage.py collectstatic命令将静态文件收录到static_root中
STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')
2、然后在urls.py中添加如下代码:
from django.conf.urls import static
from project_1 import settings
urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
四 本笔记所有代码
链接: https://pan.baidu.com/s/1gLbkU5F0MVEIzaDjTSLV6Q
提取码: 3uqr