[英]Unable to start Django server within Docker container - TypeError: argument of type 'NoneType' is not iterable
So I've created a dev-container within Docker using VSCode's Remote - Container extension.因此,我使用 VSCode 的 Remote - Container 扩展在 Docker 中创建了一个开发容器。 The config looks as follows:配置如下所示:
devcontainer.json file: devcontainer.json 文件:
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: // https://github.com/microsoft/vscode-dev-containers/tree/v0.238.0/containers/python-3-postgres // Update the VARIANT arg in docker-compose.yml to pick a Python version { "name": "Python 3 & PostgreSQL", "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspace", // Configure tool-specific properties. "customizations": { // Configure properties specific to VS Code. "vscode": { // Set *default* container specific settings.json values on container create. "settings": { "python.defaultInterpreterPath": "/usr/local/bin/python", "python.linting.enabled": true, "python.linting.pylintEnabled": true, "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", "python.formatting.blackPath": "/usr/local/py-utils/bin/black", "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint", "python.testing.pytestPath": "/usr/local/py-utils/bin/pytest" }, // Add the IDs of extensions you want installed when the container is created. "extensions": [ "ms-python.python", "ms-python.vscode-pylance" ] } }, // Use 'forwardPorts' to make a list of ports inside the container available locally. // This can be used to network with other containers or the host. "forwardPorts": [5000, 5432, 8000], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "pip install --user poetry" // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. // "remoteUser": "vscode" }
docker-compose.yml file: docker-compose.yml 文件:
> version: '3.8'
>
> services: app:
> build:
> context: ..
> dockerfile: .devcontainer/Dockerfile
> args:
> # Update 'VARIANT' to pick a version of Python: 3, 3.10, 3.9, 3.8, 3.7, 3.6
> # Append -bullseye or -buster to pin to an OS version.
> # Use -bullseye variants on local arm64/Apple Silicon.
> VARIANT: 3.9-bullseye
> # Optional Node.js version to install
> NODE_VERSION: "lts/*"
>
> volumes:
> - ..:/workspace:cached
>
> # Overrides default command so things don't shut down after the process ends.
> command: sleep infinity
>
> # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
> network_mode: service:db
> # Uncomment the next line to use a non-root user for all processes.
> # user: vscode
>
> # Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
> # (Adding the "ports" property to this file will not forward from a Codespace.)
>
> db:
> image: postgres:latest
> restart: unless-stopped
> volumes:
> - postgres-data:/var/lib/postgresql/data
> environment:
> POSTGRES_USER: postgres
> POSTGRES_DB: postgres
> POSTGRES_PASSWORD: postgres
> # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally.
> # (Adding the "ports" property to this file will not forward from a Codespace.)
>
> volumes: postgres-data: null
Dockerfile Dockerfile
> # [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye,
> 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster ARG VARIANT=3-bullseye FROM
> mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT}
>
> ENV PYTHONUNBUFFERED 1
>
> # [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 ARG NODE_VERSION="none" RUN if [ "${NODE_VERSION}" != "none" ]; then su
> vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install
> ${NODE_VERSION} 2>&1"; fi
>
> # [Optional] If your requirements rarely change, uncomment this section to add them to the image.
> # COPY requirements.txt /tmp/pip-tmp/
> # RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
> # && rm -rf /tmp/pip-tmp
>
> # [Optional] Uncomment this section to install additional OS packages.
> # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
> # && apt-get -y install --no-install-recommends <your-package-list-here>
I opted to install dependencies manually as they are listed within a Poetry instance.我选择手动安装依赖项,因为它们列在 Poetry 实例中。 In case I couldn't succeed with that, I installed Poetry itself as a fail-safe.万一我无法成功,我将 Poetry 本身安装为故障保险。
After installing the dependencies (using both 'pip3 install' and 'poetry install') and then trying to run "python3 manage.py runserver" OR "poetry run python3 manage.py runserver", I get the following error:安装依赖项(同时使用'pip3 install'和'poetry install')然后尝试运行“python3 manage.py runserver”或“poetry run python3 manage.py runserver”后,我收到以下错误:
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner
self.run()
File "/usr/local/lib/python3.9/threading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run
self.check(display_num_errors=True)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/management/base.py", line 419, in check
all_issues = checks.run_checks(
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/registry.py", line 76, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/urls.py", line 23, in check_resolver
return check_method()
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/urls/resolvers.py", line 417, in check
messages.extend(check_resolver(pattern))
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/urls.py", line 23, in check_resolver
return check_method()
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/urls/resolvers.py", line 419, in check
return messages or self.pattern.check()
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/urls/resolvers.py", line 282, in check
if '(?P<' in route or route.startswith('^') or route.endswith('$'):
TypeError: argument of type 'NoneType' is not iterable
The machine I'm running is Macbook Air 2020, which is running the Docker instance this application is in.我正在运行的机器是 Macbook Air 2020,它正在运行此应用程序所在的 Docker 实例。
I've found the solution to my problem:我找到了解决我的问题的方法:
Within my urls.py file, I had the admin url's setting as在我的 urls.py 文件中,我将管理 url 设置为
path(os.getenv('ADMIN_URL') , admin.site.urls)
But my .env was not within the container I instantiated, neither were the env variables set in the docker-compose file, as shown above.但是我的 .env 不在我实例化的容器中,也没有在 docker-compose 文件中设置 env 变量,如上所示。 So that route was showing as "None" or "NoneType".因此该路线显示为“None”或“NoneType”。
Once I corrected this, the Django server started successfully.一旦我纠正了这个问题,Django 服务器就成功启动了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.