在 AI 應用開發中,將大模型 API 與 Web 框架結合是常見需求。本文將詳細記錄如何使用 Django 搭建后端服務,并集成 DeepSeek API 實現智能問答功能,包含環境配置、路由設計、API 調用及異常處理的完整流程,適合需要快速搭建 AI 問答后端的開發者參考。
【實現效果】
【這是博主寫的微信小程序前端實現效果】
一、環境準備:從 Conda 到 PyCharm
搭建后端的第一步是配置開發環境,我們將使用 Conda 管理依賴,PyCharm 作為 IDE(也可使用 VS Code 等工具,流程類似)。
1.1 安裝依賴(Conda 環境內)
首先確保已激活目標 Conda 環境(如無專門環境,可先通過conda create -n django-ai python=3.10
創建),激活后執行以下命令安裝 Django:
pip install Django openai
1.2 PyCharm 創建 Django 項目
注意必須要是專業版的pycharm才有django
二、項目結構設計:拆分功能模塊
為了讓代碼結構更清晰,我們將「智能問答」功能拆分為獨立模塊chat
,包含次級路由、API 調用腳本兩個核心文件,整體項目結構如下:
三、路由配置:主路由與次級路由關聯
Django 通過「路由分發」實現模塊化管理,我們需要先配置chat
模塊的次級路由,再將其關聯到主路由。
3.1 編寫 chat 模塊的次級路由(chat/urls.py)
創建chat/urls.py
文件,定義問答接口和健康檢查接口的路由,代碼如下:
from django.urls import path
from . import deepseekAsk # 導入API調用腳本中的視圖函數# 次級路由映射:URL路徑 → 視圖函數
urlpatterns = [# 問答接口:前端發送POST請求到/chat/ask/,觸發deepseekAsk.deepseekGet函數path('ask/', deepseekAsk.deepseekGet, name='deepseek_ask'),# 健康檢查接口:前端發送GET請求到/chat/health/,觸發deepseekAsk.health_check函數path('health/', deepseekAsk.health_check, name='health_check'),
]
3.2 主路由關聯次級路由(項目配置目錄 /urls.py)
打開項目默認的主路由文件(如Django-DeepSeek-Chat/urls.py
),通過include
函數將chat
模塊的路由集成進來,代碼如下:
from django.contrib import admin
from django.urls import path, include # 導入include用于關聯次級路由urlpatterns = [path('admin/', admin.site.urls), # Django默認后臺管理路由# 關聯chat模塊的次級路由:所有以/chat/開頭的請求,都轉發到chat/urls.py處理path('chat/', include('chat.urls')),
]
四、核心邏輯:DeepSeek API 調用與視圖函數
deepseekAsk.py
是整個后端的核心,負責接收前端請求、調用 DeepSeek API、處理異常并返回結果,我們將分模塊解析其實現邏輯。
4.1 導入依賴與配置項
首先導入 Django 視圖相關工具、OpenAI SDK 及異常類,并配置 DeepSeek API 的關鍵參數(需替換為個人實際信息):
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt # 解決前后端分離跨域問題
from django.views.decorators.http import require_POST # 限制請求方法為POST
from openai import OpenAI
from openai import APIError, AuthenticationError, RateLimitError # API異常類# -------------------------- 配置項(需替換為你的信息)--------------------------
DEEPSEEK_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 從DeepSeek控制臺獲取
DEEPSEEK_BASE_URL = "https://api.deepseek.com" # DeepSeek官方API基座地址
SYSTEM_PROMPT = "你是我的私人助理,回答問題可以有性格一點,富有人情味,語言默認使用中文。" # 定義AI角色
# -----------------------------------------------------------------------------------# 初始化DeepSeek客戶端(兼容OpenAI SDK格式)
client = OpenAI(api_key=DEEPSEEK_API_KEY,base_url=DEEPSEEK_BASE_URL
)
- API Key 獲取:訪問DeepSeek 控制臺,注冊登錄后在「API 密鑰」頁面創建密鑰;
- System Prompt 作用:通過指令定義 AI 的角色和回答風格,避免 AI 回答偏離預期(如 “專業技術顧問”“幽默助手” 等)。
4.2 問答接口視圖函數(deepseekGet)
該函數是問答功能的核心,負責處理前端 POST 請求,流程分為「解析請求→參數校驗→調用 API→返回結果→異常處理」5 步:
@csrf_exempt # 前后端分離時,前端無CSRF Token,需關閉校驗(生產環境需配置跨域白名單)
@require_POST # 僅允許POST請求(符合RESTful規范,提交數據用POST)
def deepseekGet(request):try:# 1. 解析前端JSON格式請求import jsonrequest_data = json.loads(request.body) # 讀取并解析請求體中的JSON數據# 2. 校驗請求參數(確保前端傳遞了"message"字段)user_message = request_data.get("message")if not user_message or not user_message.strip(): # 排除空消息或純空格return JsonResponse({"status": "error","message": "請輸入有效的問題內容"}, status=400) # 400:HTTP狀態碼,代表請求參數錯誤# 3. 調用DeepSeek API獲取AI響應response = client.chat.completions.create(model="deepseek-chat", # DeepSeek官方聊天模型名(固定值)messages=[{"role": "system", "content": SYSTEM_PROMPT}, # 系統角色指令{"role": "user", "content": user_message.strip()} # 用戶輸入(去除首尾空格)],stream=False # 非流式返回(前端需等待完整響應,適合簡單問答場景))# 4. 解析API響應,返回給前端ai_response = response.choices[0].message.content # 提取AI回答內容return JsonResponse({"status": "success","response": ai_response # 前端通過res.response獲取AI回答})# 5. 異常處理:覆蓋常見錯誤場景,給前端明確提示except AuthenticationError: # API密鑰無效/過期return JsonResponse({"status": "error","message": "DeepSeek API密鑰無效或已過期,請檢查密鑰配置"}, status=401) # 401:身份認證失敗except RateLimitError: # API調用頻率超限return JsonResponse({"status": "error","message": "API調用頻率超限,請稍后再試"}, status=429) # 429:請求過于頻繁except APIError as e: # DeepSeek API服務異常return JsonResponse({"status": "error","message": f"DeepSeek API服務異常:{str(e)}"}, status=500) # 500:服務器內部錯誤except json.JSONDecodeError: # 前端請求格式不是JSONreturn JsonResponse({"status": "error","message": "請求格式錯誤,請使用JSON格式提交數據"}, status=400)except Exception as e: # 捕獲其他未預料的異常(避免服務崩潰)return JsonResponse({"status": "error","message": f"服務器處理失敗:{str(e)}"}, status=500)
4.3 健康檢查接口(health_check)
為了方便前端或運維人員確認后端服務狀態,添加一個簡單的健康檢查接口,支持 GET 請求:
@csrf_exempt
def health_check(request):"""處理/chat/health請求,返回后端運行狀態"""if request.method == "GET":return JsonResponse({"status": "success","message": "Backend service is running normally"})# 非GET請求返回“方法不允許”return JsonResponse({"status": "error","message": "Only GET method is allowed"}, status=405) # 405:HTTP標準狀態碼,代表請求方法不允許
4.4完整代碼
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt # 解決跨域CSRF問題(前后端分離場景)
from django.views.decorators.http import require_POST # 只允許POST請求(符合RESTful規范)
from openai import OpenAI
from openai import APIError, AuthenticationError, RateLimitError # 捕獲常見API異常# -------------------------- 配置項(請替換為你的實際信息)--------------------------
DEEPSEEK_API_KEY = "++++++++++++++++++++++++++" # 從DeepSeek控制臺獲取:https://platform.deepseek.com/
DEEPSEEK_BASE_URL = "https://api.deepseek.com" # DeepSeek官方API基座地址
SYSTEM_PROMPT = "你是我的私人助理,回答問題可以有性格一點,富有人情味,語言默認使用中文。" # 系統角色定義
# -----------------------------------------------------------------------------------# 初始化DeepSeek客戶端
client = OpenAI(api_key=DEEPSEEK_API_KEY,base_url=DEEPSEEK_BASE_URL
)@csrf_exempt # 前后端分離時,前端無CSRF Token,需關閉CSRF校驗(生產環境可配置跨域白名單)
@require_POST # 僅允許POST請求(發送消息需提交數據,符合HTTP規范)
def deepseekGet(request):try:# 1. 解析前端請求數據(前端用JSON格式發送,需先加載JSON體)import jsonrequest_data = json.loads(request.body) # 讀取并解析前端POST的JSON數據# 2. 校驗必要參數(確保前端傳遞了"message"字段)user_message = request_data.get("message")if not user_message or not user_message.strip(): # 排除空消息return JsonResponse({"status": "error","message": "請輸入有效的問題內容"}, status=400) # 400:請求參數錯誤# 3. 調用DeepSeek API獲取響應response = client.chat.completions.create(model="deepseek-chat", # DeepSeek官方聊天模型名(固定值)messages=[{"role": "system", "content": SYSTEM_PROMPT}, # 系統角色(定義助手行為){"role": "user", "content": user_message.strip()} # 用戶輸入(去除首尾空格)],stream=False # 非流式返回(前端需等待完整響應,符合當前前端邏輯))# 4. 解析API響應,返回給前端ai_response = response.choices[0].message.content # 提取AI回答內容return JsonResponse({"status": "success","response": ai_response # 前端通過resData.response獲取AI回答})# 5. 異常處理(覆蓋常見錯誤場景,給前端明確提示)except AuthenticationError:return JsonResponse({"status": "error","message": "DeepSeek API密鑰無效或已過期,請檢查密鑰配置"}, status=401) # 401:身份認證失敗except RateLimitError:return JsonResponse({"status": "error","message": "API調用頻率超限,請稍后再試"}, status=429) # 429:請求過于頻繁except APIError as e:return JsonResponse({"status": "error","message": f"DeepSeek API服務異常:{str(e)}"}, status=500) # 500:服務器內部錯誤except json.JSONDecodeError:return JsonResponse({"status": "error","message": "請求格式錯誤,請使用JSON格式提交數據"}, status=400)except Exception as e:# 捕獲其他未預料的異常(避免服務崩潰)return JsonResponse({"status": "error","message": f"服務器處理失敗:{str(e)}"}, status=500)# -------------------------- 健康檢查接口 --------------------------
@csrf_exempt # 前后端分離需關閉CSRF校驗
def health_check(request):"""處理前端/chat/health的GET請求,返回后端狀態"""# 只允許GET方法(健康檢查無需提交數據)if request.method == "GET":return JsonResponse({"status": "success","message": "Backend service is running normally"})# 非GET請求返回“方法不允許”return JsonResponse({"status": "error","message": "Only GET method is allowed"}, status=405) # 405是HTTP標準狀態碼:Method Not Allowed
五、功能測試:驗證接口可用性
完成代碼編寫后,需要測試接口是否正常工作,推薦使用 Postman 或 curl 工具(這里以 Postman 為例)。
5.1 啟動 Django 開發服務器
在項目根目錄執行命令:
python manage.py runserver
也可以使用pycharm啟動django服務器,確認啟動成功
5.2 測試健康檢查接口
1.打開 Postman,選擇「GET」方法,輸入 URL:
http://127.0.0.1:8000/chat/health/
2.點擊「Send」,若返回以下響應,說明后端服務正常:
{"status": "success","message": "Backend service is running normally"
}
5.3 測試問答接口
1.選擇「POST」方法,輸入 URL:
http://127.0.0.1:8000/chat/ask/
2.添加請求頭Content-Type:application/json
3.在「Body」→「raw」→「JSON」中輸入請求數據:
4.點擊send返回結果: