You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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已停止支持)。

解决步骤:

  1. 升级captcha包:在requirements.txt中指定兼容当前Django版本的captcha包版本,例如使用django-simple-captcha的最新稳定版:

    django-simple-captcha>=0.5.18
    

    之后重新构建并启动容器:

    docker-compose build runserver
    docker-compose up runserver
    
  2. 校验版本兼容性:确认requirements.txt中的Django版本与captcha包版本匹配,避免出现跨版本依赖冲突。

  3. 验证服务状态:解决依赖问题后,确认runserver容器无报错输出,此时本地可通过http://localhost:8000访问应用。

另外,你的depends_on配合healthcheck配置已处理MySQL服务就绪问题,无需额外调整。

内容的提问来源于stack exchange,提问作者Elahe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:33:10