如何在 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82919.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

天拓四方工業互聯網平臺賦能:地鐵電力配電室綜合監控與無人巡檢,實現效益與影響的雙重顯著提升

隨著城市化進程的不斷加快,城市軌道交通作為緩解交通壓力、提升出行效率的重要方式,在全國各大城市中得到了迅猛發展。地鐵電力配電室作為核心供電設施,其基礎設施的安全性、穩定性和智能化水平也面臨更高要求。 本文將圍繞“工業物聯網平臺…

算法打卡第11天

36.有效的括號 (力扣20題) 示例 1: **輸入:**s “()” **輸出:**true 示例 2: **輸入:**s “()[]{}” **輸出:**true 示例 3: **輸入:**s “(]”…

python 包管理工具uv

uv --version uv python find uv python list export UV_DEFAULT_INDEX"https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" # 換成私有的repo export UV_HTTP_TIMEOUT120 uv python install 3.12 uv venv myenv --python 3.12 --seed uvhttps://docs.ast…

spring的多語言怎么實現?

1.創建springboot項目,并配置application.properties文件 spring.messages.basenamemessages spring.messages.encodingUTF-8 spring.messages.fallback-to-system-localefalsespring.thymeleaf.cachefalse spring.thymeleaf.prefixclasspath:/templates/ spring.t…

JAVA:Kafka 消息可靠性詳解與實踐樣例

?? 1、簡述 Apache Kafka 是高吞吐、可擴展的流處理平臺,在分布式架構中廣泛應用于日志采集、事件驅動和微服務解耦場景。但在使用過程中,消息是否會丟?何時丟?如何防止丟? 是很多開發者關心的問題。 Kafka 提供了一套完整的機制來保障消息從生產者 ? Broker ? 消費…

【AI非常道】二零二五年五月,AI非常道

經常在社區看到一些非常有啟發或者有收獲的話語,但是,往往看過就成為過眼云煙,有時再想去找又找不到。索性,今年開始,看到好的言語,就記錄下來,一月一發布,亦供大家參考。 前面的記…

C++哈希

一.哈希概念 哈希又叫做散列。本質就是通過哈希函數把關鍵字key和存儲位置建立映射關系,查找時通過這個哈希函數計算出key存儲的位置,進行快速查找。 上述概念可能不那么好懂,下面的例子可以輔助我們理解。 無論是數組還是鏈表,查…

iOS 使用CocoaPods 添加Alamofire 提示錯誤的問題

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把這個改成 no 2 設置配置文件

mysql的Memory引擎的深入了解

目錄 1、Memory引擎介紹 2、Memory內存結構 3、內存表的鎖 4、持久化 5、優缺點 6、應用 前言 Memory 存儲引擎 是 MySQL 中一種高性能但非持久化的存儲方案,適合臨時數據存儲和緩存場景。其核心優勢在于極快的讀寫速度,需注意數據丟失風險和內存占…

若依項目AI 助手代碼解析

基于 Vue.js 和 Element UI 的 AI 助手組件 一、組件整體結構 這個 AI 助手組件由三部分組成&#xff1a; 懸浮按鈕&#xff1a;點擊后展開 / 收起對話窗口對話窗口&#xff1a;顯示歷史消息和輸入框API 調用邏輯&#xff1a;與 AI 服務通信并處理響應 <template><…

Vue2的diff算法

diff算法的目的是為了找出需要更新的節點&#xff0c;而未變化的節點則可以復用 新舊列表的頭尾先互相比較。未找到可復用則開始遍歷&#xff0c;對比過程中指針逐漸向列表中間靠攏&#xff0c;直到遍歷完其中一個列表 具體策略如下&#xff1a; 同層級比較 Vue2的diff算法只…

mongodb集群之分片集群

目錄 1. 適用場景2. 集群搭建如何搭建搭建實例Linux搭建實例(待定)Windows搭建實例1.資源規劃2. 配置conf文件3. 按順序啟動不同角色的mongodb實例4. 初始化config、shard集群信息5. 通過router進行分片配置 1. 適用場景 數據量大影響性能 數據量大概達到千萬級或億級的時候&…

DEEPSEEK幫寫的STM32消息流函數,直接可用.已經測試

#include "main.h" #include "MessageBuffer.h"static RingBuffer msgQueue {0};// 初始化隊列 void InitQueue(void) {msgQueue.head 0;msgQueue.tail 0;msgQueue.count 0; }// 檢查隊列狀態 type_usart_queue_status GetQueueStatus(void) {if (msgQ…

華為歐拉系統中部署FTP服務與Filestash應用:實現高效文件管理和共享

華為歐拉系統中部署FTP服務與Filestash應用:實現高效文件管理和共享 前言一、相關服務介紹1.1 Huawei Cloud EulerOS介紹1.2 Filestash介紹1.3 華為云Flexus應用服務器L實例介紹二、本次實踐介紹2.1 本次實踐介紹2.2 本次環境規劃三、檢查云服務器環境3.1 登錄華為云3.2 SSH遠…

React---day5

4、React的組件化 組件的分類&#xff1a; 根據組件的定義方式&#xff0c;可以分為&#xff1a;函數組件(Functional Component )和類組件(Class Component)&#xff1b;根據組件內部是否有狀態需要維護&#xff0c;可以分成&#xff1a;無狀態組件(Stateless Component )和…

測試策略:AI模型接口的單元測試與穩定性測試

測試策略:AI模型接口的單元測試與穩定性測試 在構建支持AI能力的系統中,開發者不僅要關注業務邏輯的正確性,也必須保障AI模型接口在各種環境下都能穩定運行。這就要求我們在開發階段制定清晰的測試策略,從功能驗證到性能保障,逐步推進系統可用性、可維護性與可擴展性的提…

UniApp 生產批次管理模塊技術文檔

UniApp 生產批次管理模塊技術文檔 1. 運行卡入站頁面 (RunCardIn) 1.1 頁面結構 <template><!-- 頁面容器 --><view class"runCardIn" :style"{ paddingTop: padding }"><!-- 頁頭組件 --><pageHeader :title"$t(MENU:…

針對Helsinki-NLP/opus-mt-zh-en模型進行雙向互翻的微調

引言 ?題目聽起來有點怪怪的&#xff0c;但是實際上就是對Helsinki-NLP/opus-mt-en-es模型進行微調。但是這個模型是單向的&#xff0c;只支持中到英的翻譯&#xff0c;反之則不行。這樣的話&#xff0c;如果要做中英雙向互翻就需要兩個模型&#xff0c;那模型體積直接大了兩倍…

Object轉Map集合

對象與 Map 轉換詳解&#xff1a; Object.entries() 和 Object.fromEntries() 1&#xff0c;Object.fromEntries() 的主要用途就是將鍵值對集合&#xff08;如 Map&#xff09;轉換為普通對象。 2&#xff0c;Object.entries() 返回一個二維數組&#xff0c;其中每個子數組包…

優先隊列用法

第 5 行定義了一個隊首是最大值的優先隊列,第 10 行的輸出如下: 27 - wuhan 21 - shanghai 11 - beijing 第 13 行定義了一個隊首是最小值的優先隊列,第 19 行的輸出如下: 11 - beijing 21 - shanghai 27 - wuhan #include <bits/stdc.h> using namespace std; int…