标签 Django 下的文章

使用 django 的 command 启动 langGraph Server, 但要求基于 AsyncPostgresSaver,
没有找到相关的可用的代码, 这里记录下 直接抛出代码

"""
Run the LangGraph Agent Server
"""

import asyncio
import uvicorn
from django.core.management.base import BaseCommand
from django.conf import settings
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from langserve import add_routes
from langchain_core.globals import set_verbose
from psycopg_pool import AsyncConnectionPool
from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
from apps.ai.graph.app import AsyncGraphApp


class Command(BaseCommand):
    """
    Run the LangGraph Agent Server
    """

    help = "Starts the LangGraph Agent Server"

    def add_arguments(self, parser):
        parser.add_argument("--host", type=str, default="0.0.0.0")
        parser.add_argument("--port", type=int, default=2028)

    def handle(self, *args, **options):
        asyncio.run(self.handle_async(*args, **options))

    async def handle_async(self, *args, **options):
        """启动 Agent Server"""
        host = options["host"]
        port = options["port"]

        self.stdout.write(f"Starting Agent Server at http://{host}:{port}...")

        # Get the LangGraph application
        checkpointer = await self.get_checkpointer()
        graph_app = AsyncGraphApp().compile(checkpointer=checkpointer).app
        print(f"graph_app----------------->: {graph_app}")

        # Initialize FastAPI app
        app = FastAPI(
            title="Baby Consultant Agent",
            version="1.0",
            description="A LangGraph-based agent for baby consultation",
        )

        # Set CORS
        app.add_middleware(
            CORSMiddleware,
            allow_origins=["*"],
            allow_credentials=True,
            allow_methods=["*"],
            allow_headers=["*"],
        )
        set_verbose(True)
        # Add routes using LangServe
        # This exposes the graph at /agent/invoke, /agent/stream, etc.
        add_routes(
            app,
            graph_app,
            path="/agent",
        )

        # Run with Uvicorn
        config = uvicorn.Config(app, host=host, port=port)
        # 基于当前的Async Running Loop 启动unicorn
        server = uvicorn.Server(config)
        await server.serve()

    async def get_checkpointer(self):
        """获取 Checkpointer"""
        # 1. 显式创建连接池 (让它在应用生命周期内一直存活)
        connection_kwargs = {
            "autocommit": True,
            "prepare_threshold": 0,
        }

        # 使用同步的 ConnectionPool
        pool = AsyncConnectionPool(
            conninfo=settings.LANGGRAPH_POSTGRES_CONNECTION_STRING,
            max_size=20,
            kwargs=connection_kwargs,
        )

        # 2. 将连接池传入构造函数
        checkpointer = AsyncPostgresSaver(pool)

        # 3. 初始化数据库表
        await checkpointer.setup()

        return checkpointer

使用 django 的 command 启动 langGraph Server, 但要求基于 AsyncPostgresSaver,
没有找到相关的可用的代码, 这里记录下 直接抛出代码

"""
Run the LangGraph Agent Server
"""

import asyncio
import uvicorn
from django.core.management.base import BaseCommand
from django.conf import settings
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from langserve import add_routes
from langchain_core.globals import set_verbose
from psycopg_pool import AsyncConnectionPool
from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
from apps.ai.graph.app import AsyncGraphApp


class Command(BaseCommand):
    """
    Run the LangGraph Agent Server
    """

    help = "Starts the LangGraph Agent Server"

    def add_arguments(self, parser):
        parser.add_argument("--host", type=str, default="0.0.0.0")
        parser.add_argument("--port", type=int, default=2028)

    def handle(self, *args, **options):
        asyncio.run(self.handle_async(*args, **options))

    async def handle_async(self, *args, **options):
        """启动 Agent Server"""
        host = options["host"]
        port = options["port"]

        self.stdout.write(f"Starting Agent Server at http://{host}:{port}...")

        # Get the LangGraph application
        checkpointer = await self.get_checkpointer()
        graph_app = AsyncGraphApp().compile(checkpointer=checkpointer).app
        print(f"graph_app----------------->: {graph_app}")

        # Initialize FastAPI app
        app = FastAPI(
            title="Baby Consultant Agent",
            version="1.0",
            description="A LangGraph-based agent for baby consultation",
        )

        # Set CORS
        app.add_middleware(
            CORSMiddleware,
            allow_origins=["*"],
            allow_credentials=True,
            allow_methods=["*"],
            allow_headers=["*"],
        )
        set_verbose(True)
        # Add routes using LangServe
        # This exposes the graph at /agent/invoke, /agent/stream, etc.
        add_routes(
            app,
            graph_app,
            path="/agent",
        )

        # Run with Uvicorn
        config = uvicorn.Config(app, host=host, port=port)
        # 基于当前的Async Running Loop 启动unicorn
        server = uvicorn.Server(config)
        await server.serve()

    async def get_checkpointer(self):
        """获取 Checkpointer"""
        # 1. 显式创建连接池 (让它在应用生命周期内一直存活)
        connection_kwargs = {
            "autocommit": True,
            "prepare_threshold": 0,
        }

        # 使用同步的 ConnectionPool
        pool = AsyncConnectionPool(
            conninfo=settings.LANGGRAPH_POSTGRES_CONNECTION_STRING,
            max_size=20,
            kwargs=connection_kwargs,
        )

        # 2. 将连接池传入构造函数
        checkpointer = AsyncPostgresSaver(pool)

        # 3. 初始化数据库表
        await checkpointer.setup()

        return checkpointer

项目介绍:

基于 Django、langgraph、langchain 开发的 AI 自动化测试平台。

目前功能:

1、需求文档智能评审并指正需要改正的问题。
2、AI 根据知识库和需求文档生成测试用例。
3、自然语言用例执行并生成对应的 playwright 自动化脚本。
4、执行用例时自动截图上传会平台。
5、批量执行功能测试用例和 playwright 脚本并生成对应的报告。

效果展示



如果项目对你有帮助,请帮我点点 star ~

项目地址: MGdaasLab/WHartTest: WHartTest 是基于 Django REST Framework 与现代大模型技术打造的 AI 驱动测试自动化平台。平台聚合自然语言理解、知识库检索与嵌入搜索能力,结合 LangChain 与 MCP(Model Context Protocol) 工具调用,实现从需求到可执行测试用例的自动化生成与管理,帮助测试团队提升效率与覆盖率。

声明:

本人纯编程小白,项目由本人提供思路,AI 负责功能代码实现。(也算是站在巨人的肩膀上了)


📌 转载信息
原作者:
duanxc
转载时间:
2025/12/30 18:07:51

[请问各位都什么境界, 狗头..]

初级程序员:练气期、筑基期:

  • 熟悉 Python 的基本语法和数据类型;
  • 能够使用常见的数据结构和算法;
  • 能够编写简单的 Python 程序,并能够进行调试和测试;
  • 了解基本的软件工程和开发流程。

中级程序员:结丹期、元婴期:

  • 熟悉 Python 的高级特性,例如面向对象编程、装饰器、生成器等;
  • 能够设计和实现复杂的 Python 程序;
  • 熟悉常见的 Python 框架和库,例如 Django 、Flask 、numpy 等;
  • 了解常见的数据库和数据处理技术。

    高级程序员:化神期、炼虚期:

  • 熟练掌握 Python 的高级特性,包括元类、协程等;
  • 能够设计和实现高性能的 Python 程序,包括并发编程和异步编程;
  • 熟悉常见的机器学习和深度学习框架,例如 TensorFlow 、PyTorch 等;
  • 了解常见的大数据处理和分布式计算技术。

    资深程序员:大乘期、渡劫期:

  • 具有丰富的 Python 开发经验和实践经验;
  • 能够设计和实现复杂的系统和项目;
  • 具有优秀的代码质量和高效的开发能力;
  • 能够有效地进行项目管理和团队协作。

    专家级程序员:真仙境、证道境:

  • 具有卓越的 Python 技术水平和领域知识;
  • 能够解决复杂的技术难题和挑战;
  • 具有独到的编程思想和创新能力;
  • 能够对 Python 技术和生态做出重要的贡献和影响。

    大师级程序员:秩序境:

  • 是 Python 领域的顶尖专家和领袖人物;
  • 具有深厚的技术功底和卓越的创新能力;
  • 能够引领和影响整个 Python 社区和行业;
  • 能够推动 Python 技术的发展和演进。