[CTMS]ctms-gateway源码说明及完整代码获取

73 阅读3分钟

在 ctms-gateway 项目中,apps 目录下的 4 个文件分别负责不同的功能模块。以下是每个文件的详细说明:

1. auth.py

1.1 功能:处理用户认证相关的逻辑。

1.2 主要代码:

async def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
    token = credentials.credentials
    async with httpx.AsyncClient() as client:
        response = await client.get(f"{CTMS_DB_REST_URL}/auth/verify/token?token={token}")
    if response.status_code == 200:
        return response.json()
    raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,
                        detail="Invalid authentication credentials",
                        headers={"WWW-Authenticate""Bearer"})

1.3 作用:

  • 提供 verify_token 函数,用于验证用户 Token 的有效性。
  • 通过 HTTP 请求调用后端服务(CTMS_DB_REST_URL)进行 Token 验证。
  • 如果验证失败,抛出 HTTPException 异常,返回 401 状态码。

2. auth_view.py

2.1 功能:处理与认证相关的 API 请求。

2.2 主要代码:

@app.api_route("/{path:path}", methods=["GET""POST""PUT""DELETE"])
async def proxy(request: Request, path: str):
    url = f"{CTMS_DB_REST_URL}/auth/{path}"
    if len(request.query_params) != 0:
        url = f"{url}?{request.query_params}"
    async with httpx.AsyncClient() as client:
        response = await client.request(
            method=request.method,
            url=url,
            headers={key: value for key, value in request.headers.items() if key!= "host"},
            data=await request.body(),
            cookies=request.cookies
        )
        return Response(content=response.content, status_code=response.status_code, headers=dict(response.headers))

2.3作用:

  • 提供认证相关的 API 路由,将请求代理到后端服务(CTMS_DB_REST_URL)。
  • 支持 GET、POST、PUT、DELETE 方法。
  • 处理请求参数、请求头和 Cookie,并将后端服务的响应返回给客户端。

3. views.py

3.1 功能:处理通用的 API 请求。

3.2 主要代码:

@app.api_route("/{path:path}", methods=["GET""POST""PUT""DELETE"], dependencies=[Depends(verify_token)])
async def proxy(request: Request, path: str):
    url = f"{CTMS_DB_REST_URL}/{path}"
    if len(request.query_params) != 0:
        url = f"{url}?{request.query_params}"
    async with httpx.AsyncClient() as client:
        response = await client.request(
            method=request.method,
            url=url,
            headers={key: value for key, value in request.headers.items() if key!= "host"},
            data=await request.body(),
            cookies=request.cookies
        )
        return Response(content=response.content, status_code=response.status_code, headers=dict(response.headers))

3.3 作用:

  • 提供通用的 API 路由,将请求代理到后端服务(CTMS_DB_REST_URL)。
  • 支持 GET、POST、PUT、DELETE 方法。
  • 依赖 verify_token 函数进行 Token 验证,确保请求的安全性。
  • 处理请求参数、请求头和 Cookie,并将后端服务的响应返回给客户端。

4. ws_view.py

4.1 功能:处理 WebSocket 请求,实现双向消息转发。

4.2 主要代码:

@app.websocket("/ws/{service_name}/{path:path}", dependencies=[Depends(verify_token)])
async def websocket_proxy(websocket: WebSocket, service_name: str, path: str):
    SERVICES = {
        "core": CTMS_CORE_WS_URL,
        "db": CTMS_DB_WS_URL
    }
    if service_name not in SERVICES:
        await websocket.close(code=1008, reason="Service not found")
        return
    target_url = f"{SERVICES[service_name]}/{path}"
    async with httpx.AsyncClient() as client:
        async with client.stream("GET", target_url) as target_ws:
            await websocket.accept()
            async def forward_to_client():
                async for message in target_ws.aiter_text():
                    await websocket.send_text(message)
            async def forward_to_target():
                async for message in websocket.iter_text():
                    await target_ws.send_text(message)
            await asyncio.gather(forward_to_client(), forward_to_target())

4.3 作用:

  • 提供 WebSocket 路由,支持与不同服务(如 core 和 db)的双向通信。
  • 依赖 verify_token 函数进行 Token 验证,确保连接的安全性。
  • 实现客户端与目标服务之间的消息双向转发。
  • 如果目标服务不存在,关闭 WebSocket 连接并返回错误信息。

5. 总结

  • auth.py:负责 Token 验证逻辑。
  • auth_view.py:处理认证相关的 API 请求。
  • views.py:处理通用的 API 请求,依赖 Token 验证。
  • ws_view.py:处理 WebSocket 请求,实现双向消息转发。

这些文件共同构成了 ctms-gateway 项目的核心功能模块,分别负责认证、API 代理和 WebSocket 通信等功能。

6. 获取源码

  1. 关注公众号
  2. 后台发送关键字:ctms-gateway

7. 联系方式

  • 公众号:ScienceStudio

公众号二维码 1.png