Windows系统上Pyinstaller 打包Django项目
切换到工程目录,在工程目录的虚拟环境中安装Pyinstaller.
安装pyinstaller
pip install pyinstaller
打包
执行下面的命令,生成可执行文件的目录
pyinstaller -D manage.py
生成两个文件夹dist和build ,以及一个配置文件manage.spec。
其中要使用的可执行文件位于dist/manage/manage.exe
运行
切换到exe文件所在目录,运行dos窗口。
manage.exe runserver
在windows系统上,运行exe文件不需要用python运行,以下是个错误的示例。
python manage.exe runserver
报错解决
缺模块 Modules
运行服务后,在cmd窗口可以看到缺失包的提示。
根据提示一一添加至manage.spec文件中的hiddenimports列表中:
hiddenimports=['my_app.apps','my_app.admin','my_app.models','my_app.urls','my_app.views','my_app.middlewares.auth']
所缺失的模块,基本都是自定义添加的app中的.py文件。
之后回到工程目录下,运行cmd窗口,使用下面的命令重新打包:
pyinstaller manage.spec
缺模板文件 Templates
将templates文件,拷贝到dist/manage目录下,刷新页面即可。
也可以通过配置.spec文件的方式打包的时候自动完成拷贝动作。
datas=[(r'D:\Project\project_python\my_pro\templates', r'.\templates'),]
其中,元组中第一个元素是模板文件存放的绝对路径,第二个元素是打包完成后,在根目录下的相对路径。
缺静态资源文件 Static
项目部署的时候,或者开发者模式下debug模式是关闭的,此时Django不会调用原来的static文件。
需要为静态资源文件指定一个根目录STATIC_ROOT
,并启用Nginx
做反向代理。
- 修改工程文件中的
urls.py
文件,给文件中添加静态文件根目录。
from django.contrib import admin
from django.urls import path
from django.conf.urls import static
from camera_pro import settings
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
- 配置settings.py文件中的根目录
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
- 回到工程目录下,运行cmd窗口,重新运行一次打包命令:
pyinstaller manage.spec
- 运行静态资源收集程序,将所有的静态资源文件拷贝在项目根目录下得static文件夹中
python manage.py collectstatic
- 将收集完整的静态资源文件夹
static
拷贝到dist/manage目录下。 - 如果清楚知道静态资源的位置,也可以跳过第4,5步,直接在dist/manage目录下创建一个
static
文件夹,人工把所有的静态资源文件拷贝过来。 - 也可以通过配置.spec文件自动完成拷贝。
datas=[(r'D:\Project\project_python\my_pro\static', r'.\static'),
(r'D:\Project\project_python\my_pro\templates', r'.\templates')]
还可以配置添加其它需要拷贝到打包根目录下的内容:
datas=[(r'D:\Project\project_python\my_pro\static', r'.\static'),
(r'D:\Project\project_python\my_pro\templates', r'.\templates'),
(r'D:\Project\project_python\my_pro\upload', r'.\upload')]
- 对Nginx的配置文件
D:\APP\nginx-1.24.0\conf\nginx.conf
,做个最简单的配置:
主要是设置server部分:
- 用80端口代理8000端口。
- 配置要代理的指向:http://127.0.0.1:8000/。
- 配置静态资源文件路径。
- 指定项目运行的根目录, 如果之前指定的目录和当前目录不同,这里一定要重新写.
- 需要注意的是,这里配置的路径均为部署环境中的路径.
server {
listen 80;
server_name localhost;
root D:\Project\project_python\my_pro\dist\manage;
location / {
proxy_pass http://127.0.0.1:8000/;
}
location /upload {
alias D:\Project\project_python\my_pro\dist\manage\upload;
}
location /static {
alias D:\Project\project_python\my_pro\dist\manage\static;
}
- 运行Nginx服务器
切换到nginx.exe所在目录:
start nginx
在浏览其中输入127.0.0.1
,就可以访问127.0.0.1:8000
指向的页面了。
11. 如果要结束Nginx服务
nginx -s stop
- 如果要查看Nginx服务配置是否有效
nginx -t
Nginx配置完成后不能访问
如果是在测试机上跑项目,要检查下测试机上的防火墙是否配置了manage.exe
的白名单。
进一步的,可以配置下入站规则,指定允许的协议,端口,位置等信息。
同时检查下第三方安全卫士是否配置了manage.exe
的白名单。
缺包 site-packages
打包过程中,有些包会因为一些奇怪的因素,打不进来。
看一下打包流程,将打包失败的包,手动从虚拟环境中拷贝到dist/manage目录下。
对于一个工程文件,通常虚拟环境位于工程目录下的venv
文件夹下。
项目依赖的包存放在venv/Lib/site-packages
目录中。