」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 調試模式:Django Docker Pycharm

調試模式:Django Docker Pycharm

發佈於2024-11-06
瀏覽:769

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]刪除
最新教學 更多>
  • 在 Hacktoberfest 中做出貢獻的新方式:直接在前端 AI
    在 Hacktoberfest 中做出貢獻的新方式:直接在前端 AI
    Hacktoberfest 又回來了,今年為開發者帶來了一種令人興奮的新參與方式。 您現在可以直接透過 Webcrumbs 平台上的 Frontend AI 建立和提交模板,而不是傳統的 GitHub Pull 請求。只需前往tools.webcrumbs.org,對模板進行編碼,然後在準備好後點擊...
    程式設計 發佈於2024-11-07
  • 為什麼使用不帶括號的函數指標時“cout”列印“1”?
    為什麼使用不帶括號的函數指標時“cout”列印“1”?
    為什麼「cout a function without call it (not f() but f;). Print 1 Always?」在此程式碼中,程式碼嘗試在不使用括號的情況下「呼叫」名為pr 的函數。然而,這實際上並不是呼叫該函數。相反,它將函數指標傳遞給 cout 函數。當函數指標隱式轉...
    程式設計 發佈於2024-11-07
  • 讓您的網頁更快
    讓您的網頁更快
    什么是 DOM?它吃什么? DOM(文档对象模型)是网页及其开发的基础。它是 HTML 和 XML 文档的编程接口,以树状对象表示文档的结构。有树枝和树叶。文档中的每个元素、属性和文本片段都成为该树中的一个节点。它允许 JavaScript 与 HTML 元素交互、修改它们或添加新...
    程式設計 發佈於2024-11-07
  • JavaScript 中的 require 與 import
    JavaScript 中的 require 與 import
    我記得當我開始編碼時,我會看到一些js檔案使用require()來匯入模組和其他檔案使用import。這總是讓我感到困惑,因為我並不真正理解其中的差異是什麼,或者為什麼專案之間存在不一致。如果您想知道同樣的事情,請繼續閱讀! 什麼是 CommonJS? CommonJS 是一組用於...
    程式設計 發佈於2024-11-07
  • 使用鏡像部署 Vite/React 應用程式:完整指南
    使用鏡像部署 Vite/React 應用程式:完整指南
    在 GitHub Pages 上部署 Vite/React 应用程序是一个令人兴奋的里程碑,但这个过程有时会带来意想不到的挑战,特别是在处理图像和资产时。这篇博文将引导您完成整个过程,从最初的部署到解决常见问题并找到有效的解决方案。 无论您是初学者还是有经验的人,本指南都将帮助您避免常见的陷阱,并...
    程式設計 發佈於2024-11-07
  • 我如何在我的 React 應用程式中優化 API 呼叫
    我如何在我的 React 應用程式中優化 API 呼叫
    作为 React 开发者,我们经常面临需要通过 API 同步多个快速状态变化的场景。对每一个微小的变化进行 API 调用可能效率低下,并且会给客户端和服务器带来负担。这就是去抖和巧妙的状态管理发挥作用的地方。在本文中,我们将构建一个自定义 React 钩子,通过合并有效负载和去抖 API 调用来捕获...
    程式設計 發佈於2024-11-07
  • 我們走吧!
    我們走吧!
    為什麼你需要嘗試 GO Go 是一種快速、輕量級、靜態類型的編譯語言,非常適合建立高效、可靠的應用程式。它的簡單性和簡潔的語法使其易於學習和使用,特別是對於新手來說。 Go 的突出功能包括內建的 goroutine 並發性、強大的標準庫以及用於程式碼格式化、測試和依賴管理的強大工具...
    程式設計 發佈於2024-11-06
  • 如何將 PNG 圖像編碼為 CSS 資料 URI 的 Base64?
    如何將 PNG 圖像編碼為 CSS 資料 URI 的 Base64?
    在CSS 資料URI 中對PNG 圖像使用Base64 編碼為了使用資料URI 將PNG 圖片嵌入到CSS 樣式表中,PNG資料必須先編碼為Base64 格式。此技術允許將外部圖像檔案直接包含在樣式表中。 Unix 命令列解決方案:base64 -i /path/to/image.png此指令將輸出...
    程式設計 發佈於2024-11-06
  • API 每小時資料的響應式 JavaScript 輪播
    API 每小時資料的響應式 JavaScript 輪播
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    程式設計 發佈於2024-11-06
  • 用於 Web 開發的 PHP 和 JavaScript 之間的主要差異是什麼?
    用於 Web 開發的 PHP 和 JavaScript 之間的主要差異是什麼?
    PHP 與 JavaScript:伺服器端與客戶端 PHP 的作用與 JavaScript 不同。 PHP 運行在伺服器端。伺服器運行應用程式。除此之外,它還處理表單。當您提交表單時,PHP 會對其進行處理。另一方面,JavaScript 是客戶端的。它在瀏覽器中運行。它處理頁面互...
    程式設計 發佈於2024-11-06
  • 如何在 C++ 中迭代結構和類別成員以在運行時存取它們的名稱和值?
    如何在 C++ 中迭代結構和類別成員以在運行時存取它們的名稱和值?
    迭代結構體和類別成員在 C 中,可以迭代結構體或類別的成員來檢索它們的名稱和價值觀。以下是實現此目的的幾種方法:使用巨集REFLECTABLE 巨集可用於定義允許自省的結構。該巨集將結構體的成員定義為以逗號分隔的類型名稱對清單。例如:struct A { REFLECTABLE ( ...
    程式設計 發佈於2024-11-06
  • 如果需要準確答案,請避免浮動和雙精度
    如果需要準確答案,請避免浮動和雙精度
    float 和 double 問題: 專為科學和數學計算而設計,執行二元浮點運算。 不適合貨幣計算或需要精確答案的情況。 無法準確表示10的負次方,例如0.1,從而導致錯誤。 範例1: 減去美元金額時計算錯誤: System.out.println(1.03 - 0.42); // Resu...
    程式設計 發佈於2024-11-06
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-06
  • 如何在 Python 中使用代理程式運行 Selenium Webdriver?
    如何在 Python 中使用代理程式運行 Selenium Webdriver?
    使用Python 中的代理程式執行Selenium Webdriver當您嘗試將Selenium Webdriver 腳本匯出為Python 腳本並從命令列執行時,可能會遇到在使用代理的情況下出現錯誤。本文旨在解決此問題,提供使用代理有效運行腳本的解決方案。 代理整合要使用代理程式來執行 Selen...
    程式設計 發佈於2024-11-06
  • || 什麼時候運算子充當 JavaScript 中的預設運算子?
    || 什麼時候運算子充當 JavaScript 中的預設運算子?
    理解|| 的目的JavaScript 中非布林運算元的運算子在JavaScript 中,||運算子通常稱為邏輯OR 運算符,通常用於計算布林表達式。但是,您可能會遇到 || 的情況。運算符與非布林值一起使用。 在這種情況下,||運算子的行為類似於「預設」運算子。它不傳回布林值,而是根據某些規則傳回左...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3