在Vercel部署Django应用时遭遇错误,请求协助排查
Django应用Vercel部署失败排查与解决方案
核心失败原因
- mysqlclient编译依赖缺失:Vercel的Python构建环境默认没有预装MySQL/MariaDB的系统级开发库(如
libmysqlclient-dev、pkg-config),导致mysqlclient==2.2.4无法编译安装,直接中断整个依赖安装流程。 - 路径不匹配:
vercel.json中配置的WSGI入口路径gestor_backend/wsgi.py与实际项目的gestion_api/wsgi.py不一致,即使依赖安装成功,后续也会出现路由错误。 - 依赖安装失败连锁反应:mysqlclient安装失败导致pip终止执行,Django等核心依赖未被安装,最终执行
collectstatic时抛出ModuleNotFoundError。
分步解决方案
方案一:替换为纯Python MySQL驱动(推荐)
避免编译依赖问题,改用无需系统库的纯Python驱动:
- 修改
requirements.txt,删除mysqlclient==2.2.4,添加:mysql-connector-python==8.3.0 - 修改
settings.py中的数据库引擎配置:DATABASES = { 'default': { 'ENGINE': 'mysql.connector.django', # 替换原django.db.backends.mysql 'NAME': 'blhxbsdfdpwwotaucuuz', 'USER': 'uwsbtwwudwfinla4', 'PASSWORD': '//password', 'HOST': 'blhxbsdfdpwwotaucuuz-mysql.services.clever-cloud.com', 'PORT': '3306' } }
方案二:在构建脚本中预装编译依赖(适合坚持用mysqlclient的场景)
在build_files.sh中先安装系统级依赖,再执行pip安装:
apt-get update && apt-get install -y libmysqlclient-dev pkg-config pip install -r requirements.txt python3 manage.py collectstatic --noinput
方案三:修正vercel.json路径错误
将vercel.json中的WSGI路径改为实际项目路径:
{ "version": 2, "builds": [ { "src": "gestion_api/wsgi.py", "use": "@vercel/python", "config": { "maxLambdaSize": "15mb", "runtime": "python3.8" } }, { "src": "build_files.sh", "use": "@vercel/static-build", "config": { "distDir": "staticfiles" } } ], "routes": [ { "src": "/static/(.*)", "dest": "/static/$1" }, { "src": "/(.*)", "dest": "gestion_api/wsgi.py" } ] }
额外生产环境优化
- 敏感信息迁移到环境变量:在Vercel项目设置中添加
SECRET_KEY、DB_PASSWORD等环境变量,修改settings.py读取环境变量:import os SECRET_KEY = os.environ.get('SECRET_KEY', '默认测试密钥') DATABASES = { 'default': { 'ENGINE': 'mysql.connector.django', 'NAME': os.environ.get('DB_NAME', 'blhxbsdfdpwwotaucuuz'), 'USER': os.environ.get('DB_USER', 'uwsbtwwudwfinla4'), 'PASSWORD': os.environ.get('DB_PASSWORD', '//password'), 'HOST': os.environ.get('DB_HOST', 'blhxbsdfdpwwotaucuuz-mysql.services.clever-cloud.com'), 'PORT': os.environ.get('DB_PORT', '3306') } } - 关闭DEBUG模式:生产环境设置
DEBUG = False,防止泄露敏感信息。 - 配置静态文件根目录:在
settings.py中添加:
确保STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')collectstatic能正确将静态文件收集到指定目录。
内容的提问来源于stack exchange,提问作者Emilio
相关产品推荐
相关产品推荐

