打包Django项目为exe
项目和开发环境
- PyCharm2023.2.1
- Python3.11
- Django4.2
- pyinstalller6.0.0
必要准备
安装pyinstaller
:
pip install pyinstaller
操作步骤
- 执行命令
pyi-makespec -D manage.py
,创建文件manage.spec
。 - 在
settings.py
中添加STATIC_ROOT
项,其中'static'
可以替换为任何自己喜欢的路径:
同时,在# 可以将'static'替换为任何其他路径 STATIC_ROOT = os.path.join(BASE_DIR, 'static') urls.py
中,添加:
然后运行命令from django.conf.urls import static from django.conf import settings urlpatterns += static.static(settings.STATIC_URL, document_root = settings.STATIC_ROOT) py manage.py collectstatic
将Django
中的静态文件加载到static
中。 - 修改文件
manage.spec
:- 对于
Analysis.hiddenimports
,增加settings.py
中INSTALLED_APPS
的所有项目:hiddenimports=[ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'lecture.apps', # 创建的项目APP ], - 对于
Analysis.datas
,增加第2步中建立的文件夹:# 其中'####\static'是上述第2步中建立文件夹的绝对路径 datas=[ (r'####\static',r'.\static') ],
- 对于
- 运行命令
pyinstaller manage.spec
打包,生成build
和dist
文件夹。 - 复制
/apps/templates
文件夹中的所有.html
文件到dist/manage/_internal/django/contrib/admin/templates
文件夹下。
生产环境
当项目部署到生产环境中时,应该设置settings.py
中的DEBUG
选项为False
。当DEBUG = True
(开发环境)时,如果项目出现错误Django
将显示错误信息提示来帮助程序员定位、解决错误。而在生产环境中,这些提示透露大量程序信息,极其不安全。
在生产环境中,配置步骤如下:
-
在
settings.py
中修改DEBUG = True
,同时完善ALLOWED_HOSTS
选项(参考官方文档)。 -
执行命令
pyi-makespec -D manage.py
,创建文件manage.spec
。 -
在
settings.py
中添加STATIC_ROOT
项:STATIC_ROOT = os.path.join(BASE_DIR, 'static') 同时,在
urls.py
中,直接在urlpatterns
内部添加:re_path('^static/(?P<path>.*)$', static.serve, {'document_root': settings.STATIC_ROOT}), 需要从
django.conf
中导入urls.static
和settings
。然后运行命令
py manage.py collectstatic
将Django
中的静态文件加载到static
中。
原因:查看在“开发环境配置”(即上述)中调用的
static.static()
源码:if not settings.DEBUG or urlsplit(prefix).netloc: # 当DEBUG = False时,返回空列表。 return [] 因此在生产环境中,
static()
并不能给urlpatterns
添加新的内容。 -
修改文件
manage.spec
;运行命令pyinstaller manage.spec
打包,生成build
和dist
文件夹;复制/apps/templates
文件夹中的所有.html
文件到dist/manage/_internal/django/contrib/admin/templates
文件夹下。
其他
- 静态文件缺失(
css/js/图片
文件):
虽然在第2步中收集了static
文件夹下的文件,但(在开发环境中)有时仍然会出现获取不到静态文件的情况。目前的解决方案是将原static
文件夹中的内容复制到.\dist\manage\_internal\django\contrib\admin\static
文件夹下(或者用打包生成的static
文件夹直接替换)。静态文件缺失的情况目前发现只在开发环境(
DEBUG = True
)中出现,不清楚根本原因。但通过上述方式可以解决。
执行
在dist/manage
文件夹下运行./manage.exe runserver 127.0.0.1:8000 --noreload
命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY