能否在IIS上将Django的HTML视图与Python后端分置于不同服务器?
可行,且能充分复用Django的核心能力
架构拆分思路
把原Django应用拆成两个独立部署的服务:
- 前端渲染服务:仅部署Django实例,专注处理HTML模板渲染、静态文件分发、用户会话管理(可选),不直接连接数据库。
- 后端API服务:部署另一台Django实例,负责数据库操作、核心业务逻辑、第三方API调用,对外提供标准化的REST/gRPC接口。
具体实现步骤
(1)改造后端API服务
- 用Django REST Framework(DRF)快速封装业务逻辑:把原视图里的数据库查询、业务处理代码迁移到DRF的视图类/序列化器中,对外暴露API接口。
- 配置数据库连接权限:仅允许这台后端服务器访问数据库,前端渲染服务器完全隔离数据库访问(符合安全要求)。
- 添加接口身份验证:比如用JWT、OAuth2,或者如果需要共享会话,就把会话存储放到Redis这类分布式存储中,让前后端服务共用会话状态。
示例DRF接口代码:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from .models import Product from .serializers import ProductSerializer class ProductListAPI(APIView): permission_classes = [IsAuthenticated] def get(self, request): products = Product.objects.filter(is_active=True) serializer = ProductSerializer(products, many=True) return Response(serializer.data)
(2)改造前端渲染服务
- 保留Django的模板系统、静态文件配置,删除数据库连接配置和业务逻辑代码。
- 在前端Django视图中,通过HTTP请求(比如用
requests库)调用后端API获取数据,再传入模板完成渲染。 - 如果用会话认证,需要配置Django的会话存储为Redis,确保前后端服务能共享用户登录状态。
示例前端渲染视图代码:
from django.shortcuts import render import requests from django.conf import settings def product_list(request): # 调用后端API api_url = f"{settings.BACKEND_API_URL}/api/products/" headers = {"Authorization": f"Bearer {request.user.auth_token}"} if request.user.is_authenticated else {} response = requests.get(api_url, headers=headers) products = response.json() if response.status_code == 200 else [] return render(request, 'products/list.html', {'products': products})
(3)安全与性能优化
- 网络隔离:配置防火墙,让前端渲染服务器只能访问后端API服务的指定端口,后端服务器不对外直接暴露。
- 页面缓存:在前端视图上使用Django的
cache_page装饰器,缓存渲染后的HTML页面,减少重复API调用。 - 静态文件托管:把静态文件放到CDN,或者用
whitenoise在前端服务器直接服务,降低后端负载。
为什么能保留Django能力?
- 前端服务依然可以使用Django的模板语法、表单验证(前端侧)、会话管理、中间件等特性。
- 后端服务继续复用Django ORM、DRF、信号系统、Admin后台等核心功能,无需切换到其他框架。
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

