Docker部署Django项目报错:无法导入python_2_unicode_compatible
问题描述
我是Docker和Django的初学者,尝试将现有Django项目容器化以接入MySQL数据库并执行runserver命令。调整requirements.txt解决依赖冲突后,runserver容器已运行,但本地无法访问应用。
报错堆栈
runserver-1 | Exception in thread django-main-thread: runserver-1 | Traceback (most recent call last): runserver-1 | File "/usr/local/lib/python3.11/threading.py", line 1045, in _bootstrap_inner runserver-1 | self.run() runserver-1 | File "/usr/local/lib/python3.11/site-packages/sentry_sdk/integrations/threading.py", line 69, in run runserver-1 | reraise(*_capture_exception()) runserver-1 | File "/usr/local/lib/python3.11/site-packages/sentry_sdk/_compat.py", line 57, in reraise runserver-1 | raise value runserver-1 | File "/usr/local/lib/python3.11/site-packages/sentry_sdk/integrations/threading.py", line 67, in run runserver-1 | return old_run_func(self, *a, **kw) runserver-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ runserver-1 | File "/usr/local/lib/python3.11/threading.py", line 982, in run runserver-1 | self._target(*self._args, **self._kwargs) runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/utils/autoreload.py", line 64, in wrapper runserver-1 | fn(*args, **kwargs) runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run runserver-1 | autoreload.raise_last_exception() runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception runserver-1 | raise _exception[1] runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 375, in execute runserver-1 | autoreload.check_errors(django.setup)() runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/utils/autoreload.py", line 64, in wrapper runserver-1 | fn(*args, **kwargs) runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/__init__.py", line 24, in setup runserver-1 | apps.populate(settings.INSTALLED_APPS) runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/apps/registry.py", line 114, in populate runserver-1 | app_config.import_models() runserver-1 | File "/usr/local/lib/python3.11/site-packages/django/apps/config.py", line 301, in import_models runserver-1 | self.models_module = import_module(models_module_name) runserver-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ runserver-1 | File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module runserver-1 | return _bootstrap._gcd_import(name[level:], package, level) runserver-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ runserver-1 | File "<frozen importlib._bootstrap>", line 1204, in _gcd_import runserver-1 | File "<frozen importlib._bootstrap>", line 1176, in _find_and_load runserver-1 | File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked runserver-1 | File "<frozen importlib._bootstrap>", line 690, in _load_unlocked runserver-1 | File "<frozen importlib._bootstrap_external>", line 940, in exec_module runserver-1 | File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed runserver-1 | File "/usr/local/lib/python3.11/site-packages/captcha/models.py", line 4, in <module> runserver-1 | from django.utils.encoding import python_2_unicode_compatible runserver-1 | ImportError: cannot import name 'python_2_unicode_compatible' from 'django.utils.encoding' (/usr/local/lib/python3.11/site-packages/django/utils/encoding.py)
配置文件
Dockerfile
FROM python:3.11 WORKDIR /app COPY requirements.txt /app RUN pip install -r requirements.txt COPY . /app EXPOSE 8000 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
docker-compose.yml
services: db: container_name: *** image: mysql:latest healthcheck: test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ] interval: 10s timeout: 3s retries: 3 restart: always environment: MYSQL_DATABASE: *** MYSQL_USER: *** MYSQL_PASSWORD: *** MYSQL_ROOT_PASSWORD: *** ports: - "3306:3306" runserver: build: . command: python manage.py runserver 0.0.0.0:8000 working_dir: /app volumes: - .:/app ports: - "8000:8000" depends_on: - db environment: DB_HOST: db DB_NAME: *** DB_USER: *** DB_PASSWORD: ***
解决方案
这个报错的核心原因是你使用的captcha包版本过旧,不兼容当前安装的Django版本。python_2_unicode_compatible装饰器在Django 3.x之后被迁移到django.utils.six模块,Django 4.x及更高版本直接移除了该装饰器(因Python 2已停止支持)。
解决步骤:
升级captcha包:在
requirements.txt中指定兼容当前Django版本的captcha包版本,例如使用django-simple-captcha的最新稳定版:django-simple-captcha>=0.5.18之后重新构建并启动容器:
docker-compose build runserver docker-compose up runserver校验版本兼容性:确认requirements.txt中的Django版本与captcha包版本匹配,避免出现跨版本依赖冲突。
验证服务状态:解决依赖问题后,确认runserver容器无报错输出,此时本地可通过
http://localhost:8000访问应用。
另外,你的depends_on配合healthcheck配置已处理MySQL服务就绪问题,无需额外调整。
内容的提问来源于stack exchange,提问作者Elahe
相关产品推荐
相关产品推荐

