iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
自我挑戰組

與AI搶奪意識ing系列 第 8

目前還不願意入手MAC,但用WINDOWS卻處處踩雷的AI QA [day5]

  • 分享至 

  • xImage
  •  

以為wsl就能進去ubuntu
結果是wsl -d Ubuntu,直接wsl會跑去docker-desktop

繼續想辦法執行這個專案後...
AI突然說:你已經完成 建立虛擬環境 → 安裝套件 → 設定環境變數 → 初始化資料庫 → 建立超級使用者。
我的OS:他騙我...設定環境變數 → 初始化資料庫 → 建立超級使用者。根本沒做...

阿靠,阿不就我有好好上課,老師說自己在做什麼,做過什麼自己要知道,不然只能看AI表演。
大概就這種感覺吧!?

在我抗議後,AI才說:阿~對啦,那我們繼續 設定環境變數 → 初始化資料庫 → 建立超級使用者。
關於設定環境變數...這專案連example都沒給...

Q:專案裡沒有.env.example
A:可先用簡單的頂著先。
DEBUG=
SECRET_KEY=
DATABASE_URL=
REDIS_URL=

接著要初始化資料庫,結果migrate不能用...因為...專案裡沒有manage.py
我再次慶幸...老師的很愛說,沒有又怎樣?自己就一個阿!
(但以我目前狀況,雖然知道自己能做一個...純手刻還真是沒法阿...)

Q:專案裡沒有manage.py....
A:專案 應該不是標準的 Django 專案結構。
從檔案來看,有 start_server.sh、requirements.txt、還有很多子資料夾,這代表作者可能是用 自訂的啟動腳本 來跑伺服器。你可以這樣檢查:打開 start_server.sh 看看裡面寫什麼。這個檔案很可能就是專案的啟動方式。在 Ubuntu 裡輸入:cat start_server.sh

我非常確定適用django 做的(跟製作者確認過),雖然目前狀況令人費解,但我還是先輸入指令,得到結果後轉給AI。

Q:在提供AI結果後..
A:這專案確實是 Django 專案,因為它是跑 config.wsgi,Django 專案才會有 wsgi.py。只是作者沒有提供 manage.py,而是直接用 Gunicorn 來跑。啟動方式不是 python manage.py runserver
而是透過 gunicorn 啟動,執行 config.wsgi 裡定義的 Django application。
需要確認虛擬環境:指令一開始是 /home/user/data/sites/candy/bin/gunicorn,這通常代表要用某個虛擬環境裡的 Gunicorn。但因為你現在環境路徑不同,可能要自己用 自己的虛擬環境 來跑。要不要我帶你先確認 你的 venv 虛擬環境裡有沒有安裝 gunicorn?

Q:Gunicorn 來跑。啟動方式不是 python manage.py runserver? 我可以改用UV來跑嗎?
A:Gunicorn vs python manage.py runserver
python manage.py runserver → Django 內建的「開發測試伺服器」,方便你本機 debug,用來上正式環境不安全。Gunicorn → 一個 WSGI 伺服器,專門用來跑正式服務。作者的 start_server.sh 就是用 Gunicorn 直接啟動專案。這是業界常見做法。

所以:
在開發測試,你可以用 python manage.py runserver(前提是專案有 manage.py)。
在部署或正式環境,一般會用 Gunicorn(或 Uvicorn + ASGI)。
你的專案沒 manage.py,所以作者設計就是要用 Gunicorn 啟。

UV(虛擬環境工具)
你說的 UV 是 Python 的新一代環境管理工具(取代 pip/venv 的那個)。
它跟「伺服器怎麼啟動」(Gunicorn / Uvicorn)是兩件事:
UV 的角色 → 管理依賴與虛擬環境,讓你乾淨安裝 requirements.txt。
Gunicorn 的角色 → 啟動 Django(WSGI 模式)。
所以答案是:你可以用 UV 來建立虛擬環境,然後在這個環境裡跑 Gunicorn。

業界標準怎麼做?
開發時:大家常用 python manage.py runserver(如果有 manage.py)。
測試/正式環境:幾乎都會用 Gunicorn(WSGI)或 Uvicorn(ASGI),再搭配 Nginx 當反向代理。

Q:WSGI/ASGI 伺服器是什麼? 正式環境是指佈署的伺服器嗎? 是不是因為作者沒用docker? 如果我有用docker,不就能確保環境相同嗎?如果用 WSGI(傳統 Django)我有辦法轉config.asgi(Django 3.0+ 才有內建)嗎? (OS:我不想切來切去,如果可以我就想用UV阿!!)
A:先回答你第一個問題:WSGI / ASGI 是什麼?

把網站想成餐廳點餐:

WSGI(傳統方式):像一個「傳統櫃檯」。
客人(使用者)來一個,就服務一個,做完再換下一個。很適合一般網頁瀏覽這種「一次來、一次回」的請求。

ASGI(新一代方式):像一個「同時處理外帶、內用、外送的櫃檯」。
不只能處理一般請求,還能處理「要一直連著線」的事(例如 WebSocket、即時通知),同時接好多單也比較有效率。

[使用者瀏覽器]
|
v
(HTTP/WS)
[Nginx 反向代理]
|
+--> [WSGI 伺服器: Gunicorn/uWSGI] --> [Django (wsgi.py)]
|
+--> [ASGI 伺服器: Uvicorn/Daphne] --> [Django (asgi.py)]

正式環境是什麼?
沒錯,「正式環境」就是專案部署到伺服器、真的要給使用者用的那個環境。
開發時(本機)可以隨便跑 python manage.py runserver,但正式環境要能承受多人同時請求,還要能持續運作,所以大家才會用 Gunicorn (WSGI) 或 Uvicorn (ASGI) 搭配 Nginx 來處理。

是不是因為作者沒用 Docker?
很可能。
如果作者有用 Docker,他就能打包一個 image,把需要的 Python、Gunicorn、Redis… 全都放在一起,別人只要 docker compose up 就能跑起來。
你現在遇到需要自己裝環境,就是因為作者直接給了原始碼和腳本,沒打包。

Docker 能確保環境相同嗎?
對。這就是 Docker 最大的好處:
你在 Mac 上打包一個容器,
我在 Windows 或 Linux 上跑起來,
裡面跑的環境(Python 版本、套件、Redis…)都一樣。
這樣就不會出現「在作者電腦能跑,換電腦就錯」的問題。

WSGI 專案能轉成 ASGI 嗎?

可以,但有前提:
Django 3.0 之後會自動產生 asgi.py。
如果你的專案現在只有 wsgi.py,你可以自己新增一個 asgi.py。內容幾乎一樣,只是 import get_asgi_application。
這樣你就能用 uvicorn config.asgi:application 來啟動。

但要注意:
如果你的程式裡沒有用 async 的功能(例如 WebSocket),ASGI 跑起來也只是同步處理,沒差太多。
如果未來要支援即時功能,ASGI 才會有優勢。

Q:支援即時功能舉例?
A:這是針對 ASGI 伺服器(像 Uvicorn)才有的優勢:
WebSocket → 即時聊天室、股票即時價格、遊戲即時狀態。
長連線 / 即時推播 → 例如:通知系統(像 LINE 或 FB 的新訊息馬上跳出)。
背景任務與 async 處理 → 可以同時處理大量請求,不用一個做完才輪到下一個。
而 WSGI(像 Gunicorn)只能處理一般 HTTP 請求(一次來、一次回)。

到這邊為止,切齊AI跟我對UV的認知,看來以後還是要得講清楚啊!!!


上一篇
目前還不願意入手MAC,但用WINDOWS卻處處踩雷的AI QA [day4]
下一篇
目前還不願意入手MAC,但用WINDOWS卻處處踩雷的AI QA [day6] end
系列文
與AI搶奪意識ing12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言