
簡介這是一套基于Django框架開發的二手商品交易平臺mymall完整源碼面向Python Web開發初學者與Django進階實踐者解決從零構建電商類應用的核心需求涵蓋用戶管理、商品發布、購物車、訂單處理及支付寶支付集成等典型業務模塊。資源共90個文件壓縮包大小10.15MB包含37個Python文件含models、views、forms、migrations等Django核心組件、12個HTML模板頁如register.html、order.html等完整頁面結構、10個JavaScript腳本支持前端交互與動態加載、9個CSS樣式文件含base.css、commodity/目錄下響應式布局以及PNG/GIF圖片、字體文件OTF/WOFF等和支付寶密鑰配置public_key、private_key、appid體現前后端分離與生產級工程組織。已有339人學習下載提供可直接運行的完整項目結構、清晰的Django App拆分app、mymall、static等、規范的遷移文件序列0001_initial.py至0014_...及requirements.txt依賴清單是理解Django MVC設計、電商系統模塊化實現與第三方支付對接的優質實戰范例。1. 為什么一個叫 mymall 的 Django 二手商城比照著源碼跑不起來你下載了一個標著“基于 Django 框架的 mymall 二手商城設計源碼”的壓縮包解壓后看到manage.py、requirements.txt、mymall/和apps/目錄心里一熱這不就是現成的 Django 電商項目但python manage.py runserver后頁面 500pip install -r requirements.txt卡在mysqlclient編譯失敗python manage.py migrate報no such table mymall_goods——問題不在代碼寫得對不對而在于Django 項目不是“解壓即用”的軟件它是一套需按環境契約重建的運行時結構。這個標題里的 mymall 不是品牌名而是項目根命名空間它不提供開箱即用的 SaaS 服務而是面向 Python Web 開發者的一套可調試、可拆解、可本地復現的二手交易業務邏輯骨架。適合剛學完 Django ORM 和 Admin 機制、正想用真實業務場景商品發布、用戶收藏、訂單狀態流轉來驗證知識閉環的中級學習者也適合需要快速搭建內部二手物資流轉平臺的運維或行政人員——前提是愿意花 2 小時配好 Python 環境、數據庫和靜態資源路徑。2. 從源碼結構反推 mymall 的核心模塊與 Django 版本適配邏輯2.1 先看目錄樹識別出哪些是 Django 原生約定哪些是 mymall 特有業務層解壓后的典型結構如下已過濾.git、__pycache__等非必要項mymall/ ├── manage.py ├── requirements.txt ├── mymall/ # 項目配置包Django 生成的 settings.py 所在 │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── apps/ # mymall 自定義應用目錄非 Django 默認屬常見工程組織法 │ ├── goods/ # 商品管理模型、視圖、模板 │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── models.py │ │ ├── views.py │ │ └── templates/goods/ │ ├── users/ # 用戶中心登錄、注冊、收貨地址 │ ├── orders/ # 訂單系統創建、支付狀態、物流跟蹤 │ └── cart/ # 購物車Session 或數據庫存儲 └── static/ # 靜態資源CSS/JS/圖片注意Django 5 默認不自動 serve ├── css/ ├── js/ └── uploads/ # 用戶上傳的商品圖需配置 MEDIA_ROOT提示apps/下各子目錄含apps.py文件且__init__.py中聲明default_app_config說明該項目使用了 Django 的 App 配置機制而非簡單將所有模型堆在models.py。這種結構利于后期拆分微服務或按業務線隔離開發。2.2 requirements.txt 解析鎖定 Django 版本與關鍵依賴鏈打開requirements.txt常見內容如下以實際高頻組合為例Django4.2.11 Pillow10.2.0 django-crispy-forms2.1 django-compressor4.4 mysqlclient2.2.4 django-redis5.3.0關鍵點有三Django 4.2.x 是 LTS 版本意味著它支持到 2026 年 4 月兼容 Python 3.8–3.12但不兼容 Python 3.13若你裝了最新版 Python請降級mysqlclient是 C 擴展Linux/macOS 需先裝mysql-devel或libmysqlclient-devWindows 用戶建議改用pymysql在settings.py中替換ENGINE并加pymysql.install_as_MySQLdb()django-crispy-forms表明前端表單用了 Bootstrap 渲染模板中會出現{% load crispy_forms_tags %}和{% crispy form %}語法若沒裝該包頁面會報Invalid template variable。2.2.1 驗證 Django 版本兼容性的最小命令在虛擬環境中執行以下命令確認版本無沖突python -m django --version # 輸出應為 4.2.11或你 requirements 中指定的版本 pip list | grep -i django\|mysql # 檢查是否同時存在 django 和 mysqlclient且無 django-allauth、django-rest-framework 等未聲明的依賴若pip install -r requirements.txt失敗優先排查mysqlclientUbuntu/Debiansudo apt-get install python3-dev default-libmysqlclient-dev build-essentialCentOS/RHELsudo yum install python3-devel mysql-devel gccmacOSbrew install mysql-client export PATH/opt/homebrew/opt/mysql-client/bin:$PATH注意不要用pip install mysql-python已廢棄也不要試圖用--force-reinstall強刷Django 4.2 與mysqlclient2.2存在JSONField兼容性問題。2.3 settings.py 關鍵字段校驗為什么 runserver 總報錯mymall/mymall/settings.py是整個項目的中樞。mymall 源碼中必須顯式配置的 4 個字段直接決定能否啟動字段名必填值示例作用說明常見錯誤INSTALLED_APPS[apps.goods, apps.users, django.contrib.admin, ...]告訴 Django 哪些 App 參與路由、模型注冊、模板加載漏掉apps.goods→No module named apps.goodsDATABASES{default: {ENGINE: django.db.backends.mysql, NAME: mymall_db, ...}}數據庫連接參數NAME庫不存在 →OperationalError: database does not existSTATIC_ROOTBASE_DIR / staticfilescollectstatic輸出路徑生產環境必需未設 →runserver可運行但collectstatic報錯MEDIA_ROOTBASE_DIR / media用戶上傳文件存儲根目錄未設或路徑無寫權限 → 上傳商品圖失敗2.3.1 快速修復runserver啟動失敗的三步檢查法檢查INSTALLED_APPS是否包含所有apps/下子目錄# mymall/mymall/settings.py INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, apps.goods, # ← 必須存在 apps.users, apps.orders, apps.cart, crispy_forms, # ← 若 requirements 有 django-crispy-forms則必須加 ]臨時切換為 SQLite繞過 MySQL 配置障礙# 替換 DATABASES 配置僅用于本地調試 DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } }此時python manage.py migrate會自動生成db.sqlite3無需手動建庫。強制收集靜態文件并啟用開發服務器靜態服務python manage.py collectstatic --noinput python manage.py runserver --nostatic # Django 4.2 默認不 serve static加 --nostatic 會 fallback 到開發模式3. 用 Django Admin 快速驗證 mymall 業務模型是否就緒3.1 注冊模型到 Admin讓后臺可操作是驗證數據層的第一步mymall 的apps/goods/models.py通常定義了Goods,Category,GoodsImage等模型。若python manage.py runserver后訪問http://127.0.0.1:8000/admin/顯示空白或報Not Found說明模型未注冊。需檢查apps/goods/admin.py# apps/goods/admin.py from django.contrib import admin from .models import Goods, Category, GoodsImage admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): list_display (name, category, price, stock, is_on_sale) list_filter (category, is_on_sale) search_fields (name, desc) admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display (name, parent, level) list_filter (level,) # 注意GoodsImage 通常用 InlineModelAdmin 嵌入 Goods 編輯頁 class GoodsImageInline(admin.TabularInline): model GoodsImage extra 3 # 重新注冊 Goods加入內聯 admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): inlines [GoodsImageInline] # ... 其他配置保持不變提示Django Admin 默認只顯示User和Group。只有在admin.py中用admin.register()或admin.site.register()顯式注冊的模型才會出現在后臺菜單欄。mymall 源碼若漏掉此步后臺就是空的——這不是 bug是故意留的驗證關卡。3.2 創建超級用戶并登錄獲取后臺入口鑰匙Django Admin 需認證用戶才能訪問。執行python manage.py createsuperuser # 按提示輸入用戶名、郵箱、密碼密碼不回顯若報django.core.exceptions.AppRegistryNotReady: Apps arent loaded yet說明INSTALLED_APPS中某個 App 的apps.py初始化失敗如引用了未安裝的第三方包。此時回到 2.3 節檢查INSTALLED_APPS順序和依賴完整性。3.2.1 登錄后必做的三件事確認 mymall 核心業務流可走通添加一個商品分類進入Categories→Add category→ 輸入手機數碼level1parentNone添加一個商品進入Goods→Add goods→ 填寫名稱iPhone 12 128G、價格3200、庫存5在Category下拉選中剛建的手機數碼上傳一張商品圖在GoodsImage內聯區域點擊Add another GoodsImage選擇本地圖片上傳。成功后訪問http://127.0.0.1:8000/首頁應能看到該商品卡片點擊進入詳情頁應展示圖片和價格。若首頁 404說明mymall/urls.py未正確 includeapps/goods/urls.py。3.3 urls.py 路由鏈路解析從根 URL 到商品詳情頁的完整路徑Django 路由是層級嵌套的。mymall 的典型路由結構為# mymall/mymall/urls.py from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns [ path(admin/, admin.site.urls), path(, include(apps.goods.urls)), # ← 根路徑交由 goods app 處理 path(users/, include(apps.users.urls)), path(orders/, include(apps.orders.urls)), ] if settings.DEBUG: urlpatterns static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT)# apps/goods/urls.py from django.urls import path from . import views urlpatterns [ path(, views.GoodsListView.as_view(), namegoods_list), path(detail/int:pk/, views.GoodsDetailView.as_view(), namegoods_detail), ]注意path(detail/int:pk/, ...)中的int:pk表示 URL 參數必須為整數且變量名為pkprimary key。若你在 Admin 中新建商品后 ID 是 1那么詳情頁 URL 就是/detail/1/。若訪問 404請檢查views.py中GoodsDetailView是否繼承DetailView并設置了model Goods。4. 寶塔面板部署 mymall繞過 Nginx 配置陷阱的 4 個硬核參數4.1 寶塔新建 Python 項目前的環境預檢寶塔v8.0支持 Django 一鍵部署但 mymall 源碼常因以下三點失敗Python 版本不匹配寶塔默認 Python 管理器裝的是 3.9而 mymallrequirements.txt要求 3.10項目路徑含中文或空格寶塔解析路徑時會截斷必須用純英文路徑如/www/wwwroot/mymall-prod未提前創建數據庫寶塔的 MySQL 管理中需手動新建庫mymall_db字符集選utf8mb4排序規則utf8mb4_unicode_ci。4.1.1 在寶塔終端中執行的初始化命令逐行復制# 進入項目目錄假設已上傳至 /www/wwwroot/mymall-prod cd /www/wwwroot/mymall-prod # 創建虛擬環境用寶塔已安裝的 Python 3.10 /usr/bin/python3.10 -m venv venv source venv/bin/activate # 升級 pip 并安裝依賴跳過 Pillow 編譯用預編譯輪子 pip install --upgrade pip pip install -r requirements.txt --find-links https://download.pytorch.org/whl/torch_stable.html --no-cache-dir # 收集靜態文件關鍵否則前端 CSS/JS 404 python manage.py collectstatic --noinput # 遷移數據庫此時 DB 已在寶塔 MySQL 中建好 python manage.py migrate提示--find-links參數指向 PyPI 鏡像可加速Pillow等大包安裝--no-cache-dir防止磁盤爆滿。4.2 寶塔站點設置中的 4 個必調參數在寶塔「網站」→「添加站點」→「Python 項目」中填寫以下值其他保持默認字段推薦值為什么必須這樣設項目路徑/www/wwwroot/mymall-prod不能是子目錄如/www/wwwroot/mymall-prod/mymallDjango 會找不到manage.py項目啟動文件mymall/wsgi.pyWSGI 是生產環境標準接口不是manage.py項目啟動命令gunicorn mymall.wsgi:application -c gunicorn.conf.py寶塔默認用uwsgi但 mymall 源碼更常配gunicorn若無gunicorn.conf.py改用gunicorn mymall.wsgi:application --bind 127.0.0.1:8000 --workers 2靜態文件路徑/www/wwwroot/mymall-prod/static/對應settings.py中STATIC_ROOT寶塔據此自動配置 Nginxlocation /static/4.2.1 手動補全 gunicorn 配置防進程崩潰若源碼未提供gunicorn.conf.py在項目根目錄新建該文件# gunicorn.conf.py import multiprocessing bind 127.0.0.1:8000 bind_mode tcp workers multiprocessing.cpu_count() * 2 1 worker_class sync worker_connections 1000 timeout 30 keepalive 2 max_requests 1000 max_requests_jitter 100 daemon False pidfile /www/wwwroot/mymall-prod/gunicorn.pid loglevel info access_log_format %(h)s %(l)s %(u)s %(t)s %(r)s %(s)s %(b)s %(f)s %(a)s accesslog /www/wwwroot/mymall-prod/logs/access.log errorlog /www/wwwroot/mymall-prod/logs/error.log注意bind地址必須與寶塔「網站」→「反向代理」中設置的目標地址一致如http://127.0.0.1:8000否則 Nginx 無法轉發請求。4.3 反向代理配置讓域名直通 mymall而非顯示 502在寶塔「網站」→「你的域名」→「反向代理」中添加一條規則代理名稱mymall-backend目標URLhttp://127.0.0.1:8000發送域名$host額外參數勾選「啟用緩存」、「緩存時間 3600 秒」保存后寶塔會自動生成 Nginx 配置片段。此時檢查/www/server/panel/vhost/nginx/your-domain.conf中是否包含location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }提示若訪問域名出現 502 Bad Gateway90% 是gunicorn進程未啟動或端口被占用。執行ps aux | grep gunicorn查看進程用kill -9 PID殺死舊進程后再在寶塔「Python 項目」中點擊「重啟」。5. 修復 mymall 前端圖片不顯示的 3 類根源及對應命令5.1 MEDIA_URL 與 MEDIA_ROOT 不匹配用戶上傳圖永久 404mymall 中商品圖、用戶頭像等由用戶上傳存儲在MEDIA_ROOT通過MEDIA_URL訪問。若settings.py中設為MEDIA_URL /media/ MEDIA_ROOT os.path.join(BASE_DIR, media)則必須確保Linux 系統中/www/wwwroot/mymall-prod/media/目錄存在且www用戶有讀寫權限Nginx 配置中顯式聲明location /media/寶塔反向代理默認不處理/media/需手動加。5.1.1 寶塔 Nginx 手動追加 media 靜態路由編輯站點配置文件/www/server/panel/vhost/nginx/your-domain.conf在server { }塊內插入location /media/ { alias /www/wwwroot/mymall-prod/media/; expires 30d; access_log off; log_not_found off; }然后重載 Nginxnginx -s reload或在寶塔「網站」→「你的域名」→「配置文件」中點擊「重載配置」。5.2 模板中圖片路徑寫死硬編碼導致跨環境失效檢查apps/goods/templates/goods/detail.html中圖片引用方式? 錯誤寫法絕對路徑僅本地有效img src/static/uploads/iphone12.jpg? 正確寫法用 Django 模板變量 url過濾器{% load static %} img src{{ goods.main_image.url }} alt{{ goods.name }} !-- 或 -- img src{{ goods.goodsimage_set.first.image.url }} alt商品圖提示main_image是Goods模型中定義的ImageField字段goodsimage_set是外鍵反向查詢管理器。若模板中直接寫{{ goods.image }}Django 會輸出相對路徑如uploads/iphone12.jpg需拼上{{ MEDIA_URL }}才能構成完整 URL。5.3 瀏覽器控制臺報 CORS 錯誤跨域請求被攔截當 mymall 前端調用/api/goods/接口返回 JSON但圖片仍不顯示檢查瀏覽器開發者工具「Network」標簽頁若圖片請求狀態碼為200但預覽為空 → 圖片文件損壞或 MIME 類型錯誤若狀態碼為0或Failed to load resource→ 瀏覽器阻止了跨域請求常見于前后端分離部署但 mymall 是傳統 Django 模板渲染此情況極少。此時執行以下命令驗證圖片文件是否真實可讀# 進入 media 目錄檢查文件權限和內容 cd /www/wwwroot/mymall-prod/media/uploads/ ls -lh file iphone12.jpg # 應輸出 JPEG image data... head -c 20 iphone12.jpg | hexdump -C # 前 20 字節應為 JPEG 簽名 ff d8 ff若file命令報cannot open iphone12.jpg (No such file or directory)說明 Django 未將上傳文件寫入MEDIA_ROOT需檢查settings.py中FILE_UPLOAD_HANDLERS是否被篡改或views.py中request.FILES未正確保存。注意Django 默認FILE_UPLOAD_HANDLERS是[django.core.files.uploadhandler.MemoryFileUploadHandler, django.core.files.uploadhandler.TemporaryFileUploadHandler]無需修改。重點檢查views.py中保存邏輯# apps/goods/views.py def upload_goods_image(request): if request.method POST: image request.FILES.get(image) if image: # 必須用 model.save() 或 FileSystemStorage().save() GoodsImage.objects.create(goodsgoods, imageimage) # ← 正確 # ? 錯誤open(/wrong/path.jpg, wb).write(image.read())本文還有配套的精品資源點擊獲取