打包Django项目为exe

项目和开发环境

  • PyCharm2023.2.1
  • Python3.11
  • Django4.2
  • pyinstalller6.0.0

必要准备

安装pyinstaller

pip install pyinstaller

操作步骤

  1. 执行命令pyi-makespec -D manage.py,创建文件manage.spec
  2. 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 collectstaticDjango中的静态文件加载到static中。
  3. 修改文件manage.spec
    • 对于Analysis.hiddenimports,增加settings.pyINSTALLED_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')
      ],
  4. 运行命令pyinstaller manage.spec打包,生成builddist文件夹。
  5. 复制/apps/templates文件夹中的所有.html文件到dist/manage/_internal/django/contrib/admin/templates文件夹下。

生产环境

当项目部署到生产环境中时,应该设置settings.py中的DEBUG选项为False。当DEBUG = True(开发环境)时,如果项目出现错误Django将显示错误信息提示来帮助程序员定位、解决错误。而在生产环境中,这些提示透露大量程序信息,极其不安全。
在生产环境中,配置步骤如下:

  1. settings.py中修改DEBUG = True,同时完善ALLOWED_HOSTS选项(参考官方文档)。

  2. 执行命令pyi-makespec -D manage.py,创建文件manage.spec

  3. 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.staticsettings

    然后运行命令py manage.py collectstaticDjango中的静态文件加载到static中。


    原因:查看在“开发环境配置”(即上述)中调用的static.static()源码:

    if not settings.DEBUG or urlsplit(prefix).netloc:
    # 当DEBUG = False时,返回空列表。
    return []

    因此在生产环境中,static()并不能给urlpatterns添加新的内容。

  4. 修改文件manage.spec;运行命令pyinstaller manage.spec打包,生成builddist文件夹;复制/apps/templates文件夹中的所有.html文件到dist/manage/_internal/django/contrib/admin/templates文件夹下。

其他

  1. 静态文件缺失(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命令。

posted @   皮皮罴  阅读(931)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示