【问题标题】:Deploying with zappa, Django project in subfolder使用 zappa 部署,子文件夹中的 Django 项目
【发布时间】:2021-07-15 02:36:03
【问题描述】:

我是 Docker、AWS Lambda 和 Zappa 的新手,但我正在尝试配置一个项目,但收效甚微。

我连接到 Docker (docker-compose run web bash),激活环境,配置 AWS 凭证并运行 zappa initzappa deploy。但是,部署后出现错误(执行zappa tail):

ModuleNotFoundError: No module named 'project'

我相信那是因为我的目录结构不是标准的:

Dockerfile
zappa_settings.json
requirements.txt
project\
- manage.py
- root\
   - settings.py
   - wsgi.py
   - ...

所以,我的 django 项目位于 project 文件夹中,因为我不喜欢将所有文件都扔在那里并与其他配置文件混合。

我的 zappa 配置文件如下所示:

{
    "dev": {
        "aws_region": "us-east-2",
        "django_settings": "project.root.settings",
        "profile_name": "default",
        "project_name": "task",
        "runtime": "python3.6",
        "s3_bucket": "bucket-name"
    }
}

还有 Dockerfile:

FROM lambci/lambda:build-python3.6

# Copy in your requirements file
ADD requirements.txt /requirements.txt

# Copy your application code to the container
RUN mkdir /code/
WORKDIR /code/
ADD . /code/

ENV PS1 'zappa@$(pwd | sed "s@^/var/task/\?@@")\$ '

ADD zappa_settings.json /var/task/zappa_settings.json

WORKDIR /var/task

RUN virtualenv /var/venv && \
    source /var/venv/bin/activate && \
    pip install -U pip zappa && \
    pip install -r /requirements.txt && \
    deactivate

CMD ["zappa"]

您能告诉我如何正确设置它吗?谢谢!

更新:

移动到子文件夹后的最新错误:

【问题讨论】:

  • 如何将Dockerfilezappa_settings.jsonrequirements.txt 文件移动到与manage.py 文件相同的位置并将zappa 配置更改为"django_settings": "root.settings"
  • 谢谢@Beomi。说得通。但是,我做到了,现在我得到了ModuleNotFoundError: No module named 'root'。我正在添加完整错误的截图。谢谢

标签: django aws-lambda zappa


【解决方案1】:

您可以使用 zappa 保留您的文件结构,它会完美运行。

给定文件结构

Dockerfile
zappa_settings.json
requirements.txt
project\
- manage.py
- root\
   - settings.py
   - wsgi.py
   - ...

您可以将Dockerfile 简化为

FROM lambci/lambda:build-python3.6

ADD . /var/task

RUN python -m venv /var/task/dockervenv && \
    source /var/task/dockervenv/bin/activate && \
    pip install -U pip zappa && \
    pip install -r /var/task/requirements.txt && \
    deactivate

WORKDIR /var/task

ENV PS1 'zappa@$(pwd | sed "s@^/var/task/\?@@")\$ '

CMD ["bash"]

从您的更新看来,您得到了类似的结果,因为您的 Django 应用程序似乎到达了 Django 代码。想必你也有edited your ALLOWED_HOSTS to accept incoming connections

现在错误 ModuleNotFoundError: No module named 'root' 是因为您的 Django 设置文件不希望存在于子目录中。您必须更新 settings.py 才能更新变量

ROOT_URLCONF = 'project.root.urls'

这应该让你启动并运行。

这种 docker 方法的副作用

顺便说一句,您设置 docker 容器的方式对编码工作流程有一些影响。您的 docker 映像将包含您的代码在构建时的副本。因此,当容器结束时,对正在运行的 docker 容器中的代码所做的任何编辑都会丢失,除非以某种方式导出(例如 git)。虽然这对于 CI/CD 管道中的稳定代码来说可能非常好,但我不建议将它用于主动开发。

如果您想将其用于主动开发,那么在调用 docker 时,请在调用容器时将您的项目直接映射为卷。例如:

docker run -ti -v $(pwd):/var/task --rm <name of your image>

【讨论】:

  • 谢谢@Edgar。我相信我已经尝试过了,错误是No module named 'project',但我会再试一次。至于“副作用”说明,您会推荐什么?只是不使用 Docker?因为我在 Windows 上,我相信我别无选择,但我想我可以迁移到 Linux。
  • Diego,用我粘贴的更新后的 docker 文件试试看,告诉我进展如何。
【解决方案2】:

只需移动,zappa_settings.json 和 zappa 生成的 .json 部署到您的子文件夹。

然后更新 zappa_settings.json: "django_settings": "project.root.settings" --> "django_settings": "root.settings"

cd 进入项目文件夹并执行 zappa update dev。

不是最好的解决方案,但它对我有用

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多