加密Python項目代碼之把Django或Flask項目打包成exe


一 前提

# 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 
# 目錄結構如下
image-20211107161643342

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文件夾
  
image-20211107161943563

2.4 運行exe,測試

# 今日到dist/run文件夾下,雙擊 run.exe,啟動
如下圖
# 瀏覽器訪問
如下圖
image-20211107162731197 image-20211107162626975

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
  
# 一路下一步安裝,打開
如下圖
image-20211107163120534

2.5.2 把dist文件夾下的run文件夾壓縮成zip

image-20211107163517224

2.5.3 使用nsis把壓縮包,做成windows安裝文件

image-20211107163628684 image-20211107163814165 image-20211107163921611

2.6 安裝剛剛打包的安裝包測試

# 雙擊 run ,打開,一路下一步
image-20211107164118276 image-20211107164256856 image-20211107164330225

image-20211107164416124

三 打包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文件夾下

image-20211107172611930

3.5 運行項目

manage.exe runserver 0.0.0.0:8080
image-20211107173113450 image-20211107173158109

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM