打包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命令。

浙公网安备 33010602011771号