加密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
posted @ 2021-11-07 17:46  刘清政  阅读(3442)  评论(1编辑  收藏  举报