当前位置: 首页 > article >正文

如何在 Django 中集成 MCP Server

目录

    • 背景说明
    • 第一步:使用 ASGI
    • 第二步:修改 asgi.py 中的应用
    • 第三步:Django 数据的异步查询

背景说明

有几个原因导致 Django 集成 MCP Server 比较麻烦

  • 目前支持的 MCP 服务是 SSE 协议的,需要长连接,但一般来讲 Django 是传统的连接方式
  • MCP 的 Python SDK 直接封装了 Starlette 作为 ASGI 服务的提供,和 Django 的框架并不兼容
  • 目前无法直接将 Starlette 的服务,作为 Django 某个子路由下的处理函数直接使用,我有看到一个插件项目,在处理这个事情,但目前我自己没有运行成功,欢迎交流

所以最简单的思路是 MCP 跑在另一个端口上,通过 Django ORM 来获取 Django 项目中的数据。

但如果希望集成到一个项目中使用,需要做一些调整:

  • 使用 ASGI 来处理服务请求
  • 修改 asgi.py 中的应用,指定部分路由由 Starlette 或其他 ASGI 服务处理
  • 针对 Django 数据库查询语句,进行异步环境下的使用调整

第一步:使用 ASGI

官方文档推荐了几个 ASGI 服务,可以用来替代原有的 uwsgi,包括 Daphne、Hypercorn、Uvicorn,这里以 Daphne 为例说明,因为 Daphne 提供了和 Django 更好的集成效果

  • 原有项目中 wsgi.py 下的相应调整,需要放到 asgy.py

  • 调整 settings.py 文件

    # settings.py
    INSTALLED_APPS = ['daphne', # 需要放在第一个...
    ]
    ASGI_APPLICATION = '项目名称.asgi.application'
    
  • 使用 Daphne 来接受请求,需要运行

    # 提供接口
    daphne -b 127.0.0.1 -p 8001 your_project_name.asgi:application
    # 通过 socket 文件
    daphne -u /path/to/your/project/daphne.sock your_project_name.asgi:application# 调试
    python manage.py runserver
    
  • 至于 Daphne 和 Nginx 或 Apache 的配置文件,和之前使用 uwsgi 没有太大差异

第二步:修改 asgi.py 中的应用

主要目的有几个

  • 引入 mcp 服务的 starlette app,对部分路径进行处理
  • 对于其他路径,仍由 Django 进行处理

这里作为一个参考

import osfrom django.core.asgi import get_asgi_applicationos.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名称.settings')# 原来的 application
django_asgi_app = get_asgi_application()# ============
# 写一个 mcp 服务,内容也可以挪到其他位置,引入即可
from mcp.server.fastmcp import FastMCP
from asgiref.sync import sync_to_asyncmcp1 = FastMCP("weather")@mcp1.resource("greeting://{name}")
def get_greeting(name: str) -> str:"""Get a personalized greeting"""return f"Hello, {name}!"# Add an addition tool@mcp1.tool()
def add(a: int, b: int) -> int:"""Add two numbers"""return a + bmcp1.settings.mount_path = "/star" # 告诉 mcp server 将要处理 /star 路径下的内容
starlette_app = mcp1.sse_app()# ============
# 对 application 进行引流
def application(scope, receive, send):# star 开头的服务全部交给 mcp1 处理if scope['path'].startwith('/star):scope['path'] = scope['path'].replace('/star', '', 1) # 记得把路径做个调整,不然会出错return starlette_app(scope, receive, send)# 其他交给 Django 处理return django_asgi_app(scope, receive, send)

第三步:Django 数据的异步查询

当我们定义一个 mcp 的工具,需要访问 Django 数据库时,初始化的部分需要注意:

  • 如果 mcp 的服务就在 Django 的工程目录下,和 Django 一起完成了初始化,基本不需要做数据库和配置的处理
  • 如果需要单独使用 Django 的数据库,可以参考之前的文章,完成配置。

由于 mcp 是 ASGI 服务,所以需要把所有的 Django 数据库查询调整为异步模式:

  • queryset 是惰性执行的,需要通过某些涉及数据库查询的函数才能触发执行
  • 数据库查询的函数是同步的需要调整成异步函数
# 假设我们定义了一个 Model 叫 Entry
from xxx import Entry
# 引入 sync_to_async
from asgiref.sync import sync_to_async@mcp1.tool()
# 工具函数,需要定义为 async 函数,和 mcp1 放在同一个文件里
async def get_entry(tile: str):"""Get the Entries"""# 方法一:async 循环async for e in Entry.objects.filter(title=name):results.append(e.body)breakreturn results# 方法二:通过 sync_to_async 函数,把同步函数异步执行q = Entry.objects.all()lc = sync_to_async(len)(q) # sync_to_async 会把函数变成一个 coroutinel = await lc # 等待 lc 执行results = q[0].bodyreturn results# 方法三,使用同步函数的异步版本,通常在同步函数前会增加 a,例如 aget、afirstq = await Entry.objects.afirst()results = q.bodyreturn results

相关文章:

如何在 Django 中集成 MCP Server

目录 背景说明第一步:使用 ASGI第二步:修改 asgi.py 中的应用第三步:Django 数据的异步查询 背景说明 有几个原因导致 Django 集成 MCP Server 比较麻烦 目前支持的 MCP 服务是 SSE 协议的,需要长连接,但一般来讲 Dj…...

从零开始的云计算生活——第十一天,知识延续,程序管理。

一故事背景 今日整体内容是第十天的剩余部分再加上程序管理的开头部分,详细可以回到第十天看新增加内容,现在开始讲解新内容。 二Linux程序与进程 1程序,进程,线程的概念 程序:‌是一段静态的代码,它是应用软件执行的蓝本。程序…...

React 事件处理与合成事件机制揭秘

引言 在现代前端开发的技术生态中,React凭借其高效的组件化设计和声明式编程范式,已成为构建交互式用户界面的首选框架之一。除了虚拟DOM和单向数据流等核心概念,React的事件处理系统也是其成功的关键因素。 这套系统通过"合成事件&qu…...

【React】jsx 从声明式语法变成命令式语法

在 React 中,JSX 是一种声明式的语法扩展,它使得开发者能够以类似 HTML 的方式描述用户界面。 然而,在某些情况下,可能希望将 JSX 转换为命令式语法,以获得更精细的控制或满足特定的需求。(ckeditor.com) JSX 到命令式…...

【Dify学习笔记】:Dify离线安装插件教程

Dify离线安装插件教程 1.本地下载插件 插件点击详情页面,安装右边的下载按钮,下载到本地 2.dify插件打包工具 dify-plugin-repackaging 下载后,进入到工具所在目录dify-plugin-repackaging/ git clone https://github.com/junjiem/dif…...

基于c++11重构的muduo核心库项目梳理

代码梳理 Thread创建与分配 event_channel回调函数 在muduo中,有三种类型的channel,包括 事件channel(event_channel) 这个就是普通的IO事件channel,当监听到Tcp连接有读、写、关闭、错误事件的时候,event_channel活跃accept_c…...

GitHub 趋势日报 (2025年05月29日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 1864 agenticSeek 753 langflow 749 n8n 736 prompt-eng-interactive-tutorial 42…...

Oracle 19c导入数据出现ORA-56935 ORA-39065

Oracle 19c导入数据出现ORA-56935 ORA-39065 错误内容: $ impdp \sys/xxxsjztncdb as sysdba\ dumpfileyksf0529.dmp logfileimpsjzbicd_0529.log directorySJZT TABLE_EXISTS_ACTIONtruncate parallel2Import: Release 19.0.0.0.0 - Production on Thu May 29 15…...

Java大师成长计划之第35天:未来展望与个人总结

引言 作为一门历史悠久的编程语言,Java自1995年问世以来,经历了多个版本的迭代与演进,依然在当今技术生态中占据着重要地位。从早期的Java SE、Java EE到后来的Java Spring框架,再到现代的微服务架构与云原生应用,Jav…...

7:OpenCV—图像形态学处理

OpenCV的形态学操作(对象图像进行处理) 包括图像的**腐蚀**、**膨胀**、**开**、**闭**、**形态学梯度、顶帽、黑帽、分支主题、结构元素**等操作。 1.1、膨胀 用33的核去扫描二值图像,当核与图像中的前景像素(值为1的像素)有**交集**时&…...

远控安全金标准,ToDesk、向日葵、网易UU安全功能盘点,是否能攻破防线

目录 一、引言二、设备授权管理2.1、二次验证2.2、访问权限设置2.3、黑/白名单功能 三、远程连接与数据传输3.1、身份认证强度3.2、数据传输加密能力 四、隐私安全功能4.1、隐私屏/黑屏功能对比4.2、风险提醒消息 五、主动防诈保护5.1、24小时防诈等待期5.2、金融类窗口识别与隐…...

终端没有5G图标-不支持特定NSA频段组合

某样机没有5G图标&#xff0c;而对比机有5G图标。 step1&#xff1a; 对比机工作在5G NSA上 从android日志可以看到终端工作在b28n78的NSA双载波下 05-06 14:38:51.993097 1582 1661 D RILJ : [UNSL]< UNSOL_PHYSICAL_CHANNEL_CONFIG [ { mConnectionStatusPrimaryS…...

Netty 实战篇:为 Netty RPC 框架引入调用链追踪,实现链路透明化

本文将为 RPC 框架集成调用链追踪功能&#xff0c;支持链路 ID 透传、服务调用耗时分析、错误定位等&#xff0c;打通链路透明化的“最后一公里”。 一、为什么需要链路追踪&#xff1f; 在微服务环境中&#xff0c;一个请求可能会经过多个服务节点&#xff1a; 客户端 → 服…...

第42节:模型优化与部署:Web服务部署(Flask, FastAPI)

1. 引言 在现代人工智能和机器学习应用中,模型的开发只是整个流程的一部分。 将训练好的模型有效地部署为可访问的Web服务,使其能够处理实际请求并返回预测结果,是模型价值实现的关键环节。Python生态系统提供了多种轻量级Web框架,其中Flask和FastAPI是目前最受欢迎的选择…...

pikachu通关教程-RCE

目录 RCE(remote command/code execute)概述: exec "ping" 管道符 乱码问题 RCE(remote command/code execute)概述: RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统 分为远程代码和远程命令两种.当…...

MyBatisPlus--快速入门

MyBatisPlus介绍 从名字中就可以感觉到MybatisPlus与MyBatis之间的渊源&#xff0c;而MyBatis是一个非常流行的持久层框架&#xff0c;主要来做数据库的增删改查&#xff0c;而MyBatisPlus这种命名方式让人不得不往MyBatis的升级版去联想&#xff0c;事实也确实如此&#xff0…...

鸿蒙 HarmonyOS - SideBarContainer 组件自学指南

在日常开发中&#xff0c;如果你有类似「左侧导航 右侧内容」的布局需求&#xff0c;比如后台管理界面、文件管理器、设置页等&#xff0c;​​SideBarContainer​​ 是非常值得掌握的组件。它自带侧边栏和主内容区的分离机制&#xff0c;还支持折叠、拖拽、控制按钮和多种显示…...

数据交易场景的数据质量评估

在现代数字化时代&#xff0c;数据已成为推动商业发展的核心驱动力。基于不同的交易产品和业务场景&#xff0c;数据产品的质量和准确性直接影响到数据资产的价值及其在市场中的流通性。因此&#xff0c;为数据产品提供全面、深入的数据质量评估报告&#xff0c;不仅有助于提升…...

C++ list基础概念、list初始化、list赋值操作、list大小操作、list数据插入

list基础概念&#xff1a;list中的每一部分是一个Node&#xff0c;由三部分组成&#xff1a;val、next、prev&#xff08;指向上一个节点的指针&#xff09; list初始化的代码&#xff0c;见下 #include<iostream> #include<list>using namespace std;void printL…...

39. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(函数写法)

39. 自动化异步测试开发之编写异步业务函数、测试函数和测试类&#xff08;函数写法&#xff09; 一、异步业务函数解析 1.1 页面导航函数 async def get(async_driver, url: str http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx):await…...

Go语言defer关键字:延迟执行的精妙设计

深度解析Go语言defer关键字&#xff1a;延迟执行的精妙设计 引言 在Go语言中&#xff0c;defer语句是一种独特而强大的控制流机制&#xff0c;它通过​​延迟执行​​的方式解决资源管理、错误处理和异常恢复等关键问题。理解defer的工作原理是掌握Go并发编程和错误处理的关键…...

提升WSL中Ubuntu编译速度的完整指南

在 WSL&#xff08;Windows Subsystem for Linux&#xff09;中使用 make 编译项目时&#xff0c;如果发现编译速度非常慢&#xff0c;通常是由以下几个原因导致的。以下是一些常见的排查和优化方法&#xff1a; &#x1f50d; 一、常见原因及解决方案 ✅ 1. 文件系统性能问题…...

【Linux 学习计划】-- 命令行参数 | 环境变量

目录 命令行参数 环境变量 环境变量的本质是什么&#xff1f; 相关配置文件 修改环境变量的相关操作 代码获取env —— environ 内建命令 结语 命令行参数 试想一下&#xff0c;我们的main函数&#xff0c;也是一个函数&#xff0c;那么我们的main函数有没有参数呢&am…...

服务器Docker容器创建与VScode远程连接SSH使用

一、拉取容器 1、win r 输入cmd打开终端命令行 2、终端输入 ping 192.168.xx.xxx 查看是否连接到服务器。如输出显示“字节 时间 TTL”等如下界面&#xff0c;则连接成功。否则输出“请求超时” 如果不能连接&#xff0c;则需要修改设备的IP&#xff0c;需要在设置-网络和In…...

体现物联网环境下安全防护的紧迫性 :物联网环境下的个人信息安全:隐忧与防护之道

摘要&#xff1a;随着物联网的飞速发展&#xff0c;个人信息在物联网环境下面临的安全风险日益严峻。本文深入探讨了物联网环境下个人信息泄露的主要途径&#xff0c;分析了当前个人信息安全保护面临的挑战&#xff0c;并从技术、法律、企业责任和个人意识等多方面提出了相应的…...

LiveQing 视频点播流媒体 RTMP 推流服务功能:搭建 RTMP 视频流媒体服务详细指南

LiveQing视频点播流媒体RTMP推流服务功能&#xff1a;搭建RTMP视频流媒体服务详细指南 一、流媒体服务搭建二、推流工具准备三、创建鉴权直播间四、获取推流地址五、配置OBS推流六、推流及播放七、获取播放地址7.1 页面查看视频源地址7.2 接口查询 八、相关问题解决8.1 大疆无人…...

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…...

【正点原子STM32】RS485串行通信标准(串口基础协议 和 MODBUS协议、总线连接、通信电路、通信波形图、RS485相关HAL库驱动、RS485配置步骤、)

一、RS485介绍 二、RS485相关HAL库驱动介绍 三、RS485配置步骤 四、编程实战 五、总结 串口、 UART、TTL、RS232、RS422、RS485关系 串口、UART、TTL、RS232、RS422和RS485之间的关系可以如此理解&#xff1a; 串口&#xff1a;是一个广义术语&#xff0c;通常指的是采用串行通…...

从SPDY到HTTP/2:网络协议的革新与未来

从SPDY到HTTP/2&#xff1a;网络协议的革新与未来 在互联网的发展史上&#xff0c;协议的演进始终是推动用户体验提升的关键。从早期的HTTP/1.1到如今的HTTP/2&#xff0c;再到即将全面普及的HTTP/3&#xff0c;每一次变革都伴随着性能、安全性和效率的突破。今天&#xff0c;…...

在力扣刷题中触摸算法的温度

在代码的世界里&#xff0c;每一道力扣题目都是一扇通往未知的门。当我推开这些门&#xff0c;与内置求和函数、二进制位运算、辗转相减思想以及链表结构相遇时&#xff0c;才真正触摸到算法的温度 —— 那是一种理性与智慧交织的炽热&#xff0c;也是思维不断淬炼的滚烫。​ 最…...