服务器端使用pipenv执行Django迁移失败问题排查
问题分析:Pipenv部署Django项目时的Django导入错误
一、Capistrano迁移任务代码
task :migrate do on roles(:app) do execute "cd #{release_path} && /home/ubuntu/.pyenv/shims/pipenv install" execute "cd #{release_path} && /home/ubuntu/.pyenv/shims/pipenv run python #{release_path}/manage.py makemigrations" execute "cd #{release_path} && /home/ubuntu/.pyenv/shims/pipenv run python #{release_path}/manage.py migrate" end
二、Pipfile配置
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] django = "*" pandas = "*" djangorestframework = "*" markdown = "*" django-filter = "*" django-webpack-loader = "*" django-crispy-forms = "*" pymysql = "*" beautifulsoup4 = "*" [dev-packages] [requires] python_version = "3.9"
三、报错信息
DEBUG [42151ee5] Installing dependencies from Pipfile.lock (4abb36)... DEBUG [42151ee5] To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run. INFO [42151ee5] Finished in 19.917 seconds with exit status 0 (successful). INFO [35fb8a90] Running cd /var/www/html/myappp/releases/20220923122448 && /home/ubuntu/.pyenv/shims/pipenv run python /var/www/html/myapp/releases/20220923122448/manage.py makemigrations as ubuntu@panda.example.jp DEBUG [35fb8a90] Command: cd /var/www/html/muapp/releases/20220923122448 && /home/ubuntu/.pyenv/shims/pipenv run python /var/www/html/myapp/releases/20220923122448/manage.py makemigrations DEBUG [35fb8a90] Traceback (most recent call last): File "/home/ubuntu/.local/share/virtualenvs/20220923122448-VTt_Iizv/lib/python3.8/site-packages/django/utils/timezone.py", line 10, in <module> import zoneinfo ModuleNotFoundError: No module named 'zoneinfo' raise ImportError( ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
问题根源
- Python版本不匹配:Pipfile指定使用Python3.9,但实际虚拟环境用的是Python3.8(从报错路径
/lib/python3.8/site-packages/...可看出)。zoneinfo是Python3.9及以上版本自带的模块,3.8没有该模块,而Django 4.x+依赖这个模块,所以触发导入错误,最终导致提示“找不到Django”。 - Capistrano任务路径拼写错误:命令中出现
myappp、muapp等错误路径,与实际的myapp路径不符,可能导致执行命令时找不到正确的项目文件。
解决步骤
确保服务器使用Python3.9创建虚拟环境
在服务器的项目目录下执行:# 设置当前目录使用Python3.9(需先通过pyenv安装对应版本) pyenv local 3.9.x # 删除现有错误的虚拟环境 pipenv --rm # 重新安装依赖,确保使用指定的Python版本 pipenv install --deploy修正Capistrano任务中的路径问题
改用within方法自动切换到发布目录,避免手动拼接路径出错,同时简化命令:task :migrate do on roles(:app) do within release_path do execute "/home/ubuntu/.pyenv/shims/pipenv install --deploy" execute "/home/ubuntu/.pyenv/shims/pipenv run python manage.py makemigrations" execute "/home/ubuntu/.pyenv/shims/pipenv run python manage.py migrate" end end end可选:锁定Django版本
Pipfile中django = "*"会安装最新版Django,若服务器Python版本无法兼容,建议指定兼容3.9的具体版本,比如:django = "~=4.2"
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

