You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django在同一网络中整合多外部REST API及Flask机器学习服务

两种便捷方案实现Django对接独立Flask ML服务的统一REST接口

方案一:Nginx反向代理(推荐,适配Docker环境)

这是最省心的方案,不需要修改Django代码,直接通过Nginx把指定路径的请求转发到对应Flask服务,所有子路径由Flask自行处理。

1. Nginx配置示例

在Nginx的配置文件中,添加路径匹配规则,将/api/v1/model*开头的请求转发到对应的Flask服务,其余请求默认指向Django:

server {
    listen 80;
    server_name localhost;

    # 默认请求转发到Django服务
    location / {
        proxy_pass http://django-service:8000;  # Django服务的Docker内部地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 转发model1的所有请求到对应Flask服务
    location /api/v1/model1/ {
        proxy_pass http://flask-model1:5000/;  # Flask服务的Docker内部地址,末尾的/要保留,保证子路径正确转发
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 新增其他模型只需复制上述location块,修改model名称和Flask服务地址
    location /api/v1/model2/ {
        proxy_pass http://flask-model2:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

2. Docker Compose配置

将Nginx、Django、Flask服务放在同一个Docker网络中,确保服务间可以互相访问:

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 挂载自定义Nginx配置
    networks:
      - api-network
    depends_on:
      - django-service
      - flask-model1
      - flask-model2

  django-service:
    build: ./django-api
    ports:
      - "8000:8000"
    networks:
      - api-network

  flask-model1:
    build: ./flask-model1
    ports:
      - "5000:5000"
    networks:
      - api-network

  flask-model2:
    build: ./flask-model2
    ports:
      - "5001:5000"
    networks:
      - api-network

networks:
  api-network:
    driver: bridge

方案优势

  • 完全不侵入Django代码,原有功能不受影响
  • Flask服务自主处理所有子路径(如/api/v1/model1/submitData),无需在Django中配置
  • 扩展性强:新增模型只需添加Nginx的location规则和Docker服务
  • 性能优于Django内部代理,Nginx原生支持反向代理,效率更高

方案二:Django内部反向代理

如果不想引入Nginx组件,可以在Django中实现通用代理视图,自动转发请求到对应Flask服务。

1. 编写通用代理视图

在Django的某个app中添加视图函数,负责转发请求:

from django.http import HttpResponse
import requests
from django.conf import settings

def proxy_to_flask(request, model_name, subpath):
    # 从配置中读取模型与Flask服务的映射,也可以用环境变量
    service_map = settings.FLASK_MODEL_SERVICES
    if model_name not in service_map:
        return HttpResponse("Model not found", status=404)
    
    target_url = f"{service_map[model_name]}/{subpath}"
    # 转发请求,排除Host头避免Flask服务识别错误
    headers = {k: v for k, v in request.headers.items() if k != 'Host'}
    
    # 根据请求方法转发数据
    response = requests.request(
        method=request.method,
        url=target_url,
        headers=headers,
        data=request.body,
        params=request.GET,
        timeout=10  # 根据实际情况设置超时
    )
    
    # 构造Django响应返回给客户端
    django_response = HttpResponse(response.content, status=response.status_code)
    # 转发Flask返回的响应头
    for header_name, header_value in response.headers.items():
        if header_name not in ['Content-Encoding', 'Transfer-Encoding']:
            django_response[header_name] = header_value
    return django_response

2. 配置URL路由

在Django的urls.py中添加通用路由,匹配所有模型的子路径:

from django.urls import path
from .views import proxy_to_flask

urlpatterns = [
    # 原有Django路由...
    path('api/v1/<str:model_name>/<path:subpath>', proxy_to_flask),
]

3. 添加配置映射

在Django的settings.py中添加模型与Flask服务的地址映射:

FLASK_MODEL_SERVICES = {
    'model1': 'http://flask-model1:5000',
    'model2': 'http://flask-model2:5000'
}

方案优势与不足

  • 优势:无需额外组件,所有路由统一在Django中管理
  • 不足:需要处理请求转发的细节(如headers、超时、异常),性能略低于Nginx,新增模型需要修改settings.py

总结

如果是Docker环境,优先选择Nginx反向代理方案,它更符合微服务架构的设计,扩展性和性能都更优,且不影响现有Django代码。如果不想引入额外组件,再考虑Django内部代理方案。

内容的提问来源于stack exchange,提问作者doom4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:05:55