在 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返回结果:

【感谢你的观看!欢迎关注一起学习!!!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920945.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920945.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920945.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R 语言 + 卒中 Meta 分析

R 语言 卒中 Meta 分析:4 类核心场景完整代码(含药物对比 / 剂量风险) 卒中(缺血性 / 出血性)的临床决策高度依赖循证证据,而 Meta 分析是整合多中心研究结果的核心工具。本文以卒中临床研究为核心&#x…

Goframe 框架下HTTP反向代理并支持MCP所需的SSE协议的实现

一、需求背景 Go 语言开发 MCP 服务,并在 Goframe 框架下实现 Http 反向代理,代理该 MCP 服务。 二、效果演示 三、Goframe框架简介 GoFrame 是一款模块化、低耦合设计、高性能的Go 语言开发框架。包含了常用的基础组件和开发工具,既可以作…

Git将多笔patch合并成一笔

一、方法1、在你的代码中把这多笔patch都打上2、git reset到origin那一笔(默认模式,不带soft或者hard)3、再add和commit,push二、种模式对比模式命令示例影响范围适用场景--softgit reset --soft HEAD~1仅移动 HEAD,保留修改在暂存区修改提交…

【SpringBoot】Dubbo、Zookeeper

文章目录前提知识概要分布式系统单体架构垂直应用架构分布式架构流式架构RPCDubbo概念Dubbo环境搭建Zookeeper测试 ZookeeperWindow环境下使用Dubbo-admin版本匹配不对服务注册实战内容总结导入相关依赖选择 Zookeeper 版本配置并启用 Zookeeper创建服务接口和实现(DubboServic…

【不说废话】pytorch张量相对于numpy数组的优势

核心关系 我们首先需要了解:PyTorch 张量在设计上深受 NumPy 数组的影响,它们共享许多相似的 API 和概念。实际上,PyTorch 张量可以看作是支持 GPU 加速和自动求导功能的 NumPy 数组。PyTorch 张量的主要优势 1. GPU 加速支持(最重…

拼团小程序源码分享拼团余额提现小程序定制教程开发源码二开

功能详细说明(一)首页功能进入首页,可看到以下核心功能:1、优惠券,钱包,签到,拼团,分销等各种功能入口2、推荐的商品和活动3、下方功能栏的各种功能(二)客服功…

pikachu之XSS

XSS(跨站脚本)概述Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:1.反射性XSS;2.存储型XSS;3.DOM型XSS;XSS漏洞一直被评估为web漏…

【Element Plus `el-select` 下拉菜单响应式定位问题深度解析】

Element Plus el-select 下拉菜单响应式定位问题深度解析 本文档旨在深入剖析一个在响应式布局中常见的 UI 问题:如何确保一个靠近屏幕边缘的 el-select 组件的下拉菜单,在任何屏幕尺寸下都能以预期的、优雅的方式显示。 1. 需求背景 在一个大屏数据展示…

Qt 项目文件(.pro)中添加 UI 文件相关命令

在 Qt 的 .pro 项目文件中,处理 UI 文件(.ui 文件)通常需要以下配置: 基本 UI 文件配置 自动包含 UI 文件: qmake FORMS yourfile.ui \anotherfile.ui Qt 构建系统会自动使用 uic(用户界面编译器&#xff…

展会回顾 | 聚焦医疗前沿 , 礼达先导在广州医博会展示类器官自动化培养技术

8月22-24日,广州医博会在广交会展馆B区圆满落幕。此次盛会汇聚了来自全球医疗健康领域的顶尖专家学者、企业代表与合作伙伴。展会内容涵盖基础研发、临床应用、前沿技术、产业转化、医疗服务及金融支持,全景呈现医疗健康产业的创新生态,成为连…

华为eNSP防火墙综合网络结构训练.docx

1.IP及VLAN规划情况 设备 接口 IP vlan 备注 AR1 g0/0/0 1.1.1.2/28 PPPOE g0/0/1 3.3.3.1/30 g0/0/2 114.114.114.254/24 AR2 g0/0/0 2.2.2.2/28 DHCP g0/0/1 3.3.3.2/30 g0/0/2 100.100.100.254/24 FW1 g1/0/0 10.0.0.1/30 tr…

从 Oracle 到 TiDB,通过ETL工具,高效实现数据拉通

在当前企业数字化转型的浪潮中,打破数据孤岛、实现异构数据库间的数据高效流转已成为提升业务敏捷性与决策效率的关键。许多企业在要将 Oracle 数据库中的海量数据准确地同步至TiDB 分布式数据库时遇到了挑战。这一过程不仅要求数据的绝对一致性,还对同步…

Effective c++ 35条款详解

您问到了最关键的一点!这正是策略模式的精妙之处——它通过组合(composition)而非继承(inheritance)来实现多态效果。让我详细解释这是如何工作的,以及它与传统继承多态的区别。🔄 策略模式如何…

51c自动驾驶~合集19

自己的原文哦~ https://blog.51cto.com/whaosoft/11793894 #DRAMA 首个基于Mamba的端到端运动规划器 运动规划是一项具有挑战性的任务,在高度动态和复杂的环境中生成安全可行的轨迹,形成自动驾驶汽车的核心能力。在本文中,我…

大数据新视界 -- Hive 数据仓库:架构深度剖析与核心组件详解(上)(1 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

软考 系统架构设计师系列知识点之杂项集萃(137)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(136) 第253题 在面向对象设计中,用于描述目标软件与外部环境之间交互的类被称为( ),它可以( )。 第1空 A. 实体类 B. 边界类 C. 模型类 D. 控制类 正确答案:B。 第2空 A. 表示目标软件系统中具有持久…

(附源码)基于Spring Boot公务员考试信息管理系统设计与实现

摘 要 随着公务员考试日益受到社会的广泛关注,一个高效、便捷的公务员考试信息管理系统显得尤为重要。本文设计并实现了一个基于前端Vue框架,后端采用Java与Spring Boot技术,数据库选用MySQL,并部署在Tomcat服务器上的信息管理系统…

学习JavaScript的第一个简单程序:Hello World

在JavaScript中,最简单的程序是打印"Hello World"。可以通过以下方式实现: console.log("Hello World");将上述代码保存为hello.js文件,通过Node.js运行或在浏览器控制台中执行。 浏览器环境实现 在HTML文件中嵌入Jav…

【Big Data】Alluxio 首个基于云的数据分析和开源AI数据编排技术

目录 1. 什么是 Alluxio?​ 2. Alluxio 的诞生背景:为什么需要数据编排层?​ 痛点 1:计算与存储强耦合,适配成本高​ 痛点 2:跨集群 / 跨云数据移动效率低​ 痛点 3:数据访问延迟高&#x…

uniApp App 嵌入 H5 全流程:通信与跳转细节拆解

在 uniApp App 开发中,通过 WebView 嵌入 H5 页面是常见需求(如活动页、第三方页面),核心需解决「H5 与 App 通信」「H5 操作后返回/跳转 App」两大问题。本文基于 DCloud 官方方案(原文链接),对…