”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 调试模式:Django Docker Pycharm

调试模式:Django Docker Pycharm

发布于2024-11-06
浏览:435

Debug Mode: Django Docker Pycharm

让您的本地设置正确调试您正在编写的代码所花费的时间比任何开发人员都愿意承认的要多。我们不要忘记,这主要是一个一次性完成的设置,所以如果我们不写下来,我们就不会记得。这篇文章就是为了解决这个确切的问题! 将此作为如何启动和运行本地开发环境的书面提醒。

先决条件:

  • PyCharm Professional(用于 Docker 支持)
  • Docker 和 Docker Compose
  • Django REST Framework (DRF) 应用程序

除了调试模式所需的更新之外,本文不会介绍有关 Django、Docker 或 Docker Composer 设置的详细信息。它假设您已经了解如何使该部件工作。

第 1 步:用于调试的 Dockerfile 设置

将 Dockerfile 设置为在开发模式下运行并允许来自 PyCharm 调试器的连接。

下面是一个 Dockerfile 示例:

# Builder stage
FROM python:3.9-slim as builder

RUN chmod 1777 /tmp

# Install system dependencies
RUN apt-get update && apt-get install -y \
    libpq-dev \
    build-essential

WORKDIR /app

# Copy the requirements file into the container
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt > pip_install.log

# Copy the current directory contents into the container
COPY . /app

# Collect static files
RUN python manage.py collectstatic --noinput

# Final stage
FROM python:3.9-slim

# Set environment variables
ENV PYTHONUNBUFFERED=1
ENV DJANGO_SETTINGS_MODULE=template.settings.development

# Set work directory
WORKDIR /app

# Copy files from the builder stage
COPY --from=builder /app /app

# Install pydevd-pycharm for remote debugging and gunicorn for serving
RUN pip install gunicorn pydevd-pycharm==241.17890.14 psycopg2-binary

# Expose necessary ports
EXPOSE 8000 5679  # Web app port and debug port

# Entry point for the container
ENTRYPOINT ["sh", "-c", "python manage.py runserver 0.0.0.0:8000"]

有关此代码的注意事项

  • pydevd-pycharm==241.17890.14 中的 241.17890.14 会有所不同,具体取决于您拥有的 Pycharm 版本
  • 我们公开 8000(Web 服务器端口)和 5679(调试器端口)以供外部访问。

第2步:Docker Compose配置

让我们的 docker-compose.yml 文件来配置 Web 服务(Django 应用程序)以及数据库和其他服务。

这是一个示例 docker-compose.yml:

version: '3'

services:
  web:
    environment:
      - DJANGO_ENVIRONMENT=development
      - DB_HOST=host.docker.internal
    build:
      context: .
    command: >
      sh -c "python manage.py migrate &&
             python manage.py collectstatic --noinput &&
             python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    ports:
      - "8000:8000"   # Expose web port
      - "5679:5679"   # Expose debugger port
    extra_hosts:
      - "host.docker.internal:host-gateway"
  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}

让我们进入代码分解

  • 我们正在为 Web 服务器映射端口 8000,为 PyCharm 调试器映射端口 5679。
  • extra_hosts 确保您的 Docker 容器可以使用 host.docker.internal.
  • 与主机通信

步骤 3:配置 PyCharm 进行调试

  1. 创建Python调试服务器配置:
  2. 在 PyCharm 中导航至 Run ➡️ Edit Configurations。
  3. 单击按钮并选择Python 调试服务器。
  4. 将主机设置为 0.0.0.0 或本地计算机的 IP 地址。
  5. 将端口设置为 5679(或您在 Docker 设置中公开的端口)。
  6. 然后点击保存!

  7. 启动调试器服务器:
    单击“调试”按钮(绿色错误图标)启动 PyCharm 调试器。这将开始侦听我们设置的端口。

第四步:向Django添加远程调试代码

在您的 Django 项目中,您需要在 manage.py 或 wsgi.py 中添加以下代码以连接到 PyCharm 调试器:

import pydevd_pycharm

# Connect to the PyCharm debug server
pydevd_pycharm.settrace('host.docker.internal', port=5679, stdoutToServer=True, stderrToServer=True, suspend=False)

此代码片段告诉您的 Django 应用程序连接回主机上运行的 PyCharm 调试器。 host.docker.internal 解析为 Docker 中的主机,并且 port=5679 与我们之前公开的端口匹配。

第 5 步:运行 Docker 并调试

  1. 构建并运行 Docker: 运行以下命令来启动容器:
docker-compose up --build

这将构建 Docker 映像并启动服务,包括在开发模式下运行的 Django。

2.设置断点:
在 PyCharm 中的 Django 代码中设置断点。断点应该起作用,因为您的容器将连接到在端口 5679 上运行的 PyCharm 调试服务器。

3.触发您的代码:
现在,在 Django REST Framework API 中触发任何 HTTP 请求。当代码到达断点时,PyCharm 将暂停执行,允许您检查当前状态并单步执行代码。

第 6 步:故障排除

如果在运行 Docker 时遇到错误“bind:地址已在使用”,则说明另一个进程已使用端口 5679。这种情况下,您可以:

  • 停止 PyCharm 调试器并重新启动 Docker。
  • 更改 docker-compose.yml 和 PyCharm 配置中的端口以避免冲突。

结论

这是我使用 PyCharm 强大的调试器在 Docker 容器内以开发模式运行 Django REST Framework 应用程序的设置。此设置可以帮助我通过在本地逐行调试代码来调试后端代码。

通过设置 Docker 容器与 PyCharm 通信,您可以简化 Django 应用程序的编写、测试和调试,从而更轻松地编写代码!

享受破解代码的乐趣!

版本声明 本文转载于:https://dev.to/techbychoiceorg/debug-mode-django-docker-pycharm-i8d?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-07-01
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-07-01
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-07-01
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-07-01
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-01
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当需要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考...
    编程 发布于2025-07-01
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-07-01
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-01
  • PHP与C++函数重载处理的区别
    PHP与C++函数重载处理的区别
    作为经验丰富的C开发人员脱离谜题,您可能会遇到功能超载的概念。这个概念虽然在C中普遍,但在PHP中构成了独特的挑战。让我们深入研究PHP功能过载的复杂性,并探索其提供的可能性。在PHP中理解php的方法在PHP中,函数超载的概念(如C等语言)不存在。函数签名仅由其名称定义,而与他们的参数列表无关。...
    编程 发布于2025-07-01
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-07-01
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-07-01
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-07-01
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    在node-mysql node-mysql文档最初出于安全原因最初禁用多个语句支持,因为它可能导致SQL注入攻击。要启用此功能,您需要在创建连接时将倍增设置设置为true: var connection = mysql.createconnection({{multipleStatement:...
    编程 发布于2025-07-01
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-07-01
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-07-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3