一 前提
# 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