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

調試模式:Django Docker Pycharm

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

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]刪除
最新教學 更多>
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-07-01
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當需要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請...
    程式設計 發佈於2025-07-01
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-07-01
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-07-01
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-07-01
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-07-01
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-07-01
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於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
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 在使用Chrome and IE9中的圖像時遇到的一個頻繁的問題是圍繞圖像的持續薄薄邊框,儘管指定了圖像,儘管指定了;和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下...
    程式設計 發佈於2025-07-01
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-07-01
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-07-01
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-07-01
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-07-01
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-07-01

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

Copyright© 2022 湘ICP备2022001581号-3