如何整合Django与SvelteKit搭建Web应用?
Django + SvelteKit 整合方案
先直接给核心结论:你一开始想的「两个服务分端口跑、前端调Django的JSON API」是完全可行的,而且是开发阶段最省心的方式,不存在什么更复杂的黑科技,下面把所有可行方案、误区、实操步骤讲清楚。
先纠正一个认知误区
不存在Django直接服务端渲染.svelte源文件的可行方案。Svelte是编译型前端框架,.svelte文件的解析、渲染逻辑完全由Svelte/SvelteKit自身的编译器和运行时负责,Django作为Python后端没有解析Svelte语法的能力,网上这类资料少本质是因为这个思路本身就不符合两个框架的设计逻辑,硬做只会踩一堆没必要的坑(比如Svelte的变量插值和Django模板语法冲突、响应式逻辑完全失效等),完全不推荐尝试。
方案1:开发阶段标准用法(零额外学习成本)
开发阶段直接两个服务各跑各的端口即可:
- Django 服务跑在默认的
8000端口,所有接口统一加/api/前缀,用DRF或者手写JsonResponse返回JSON数据即可 - SvelteKit 服务跑在默认的
5173端口,不管是在服务端load函数里,还是客户端事件回调中,直接请求Django接口拿数据 - 跨域问题解决:Django侧安装
django-cors-headers,把本地SvelteKit地址加到CORS_ALLOWED_ORIGINS配置里,需要带cookie鉴权的话同步打开CORS_ALLOW_CREDENTIALS = True即可。 - 如果不想处理跨域配置,直接在SvelteKit项目的
vite.config.js里加开发代理即可,配置示例:
import { defineConfig } from 'vite'; export default defineConfig({ server: { proxy: { '/api': { target: 'http://127.0.0.1:8000', changeOrigin: true } } } });
配完之后前端直接写fetch('/api/xxx')就会自动转发到Django服务,开发阶段完全感知不到跨域。
生产环境可选部署方案
根据你要不要用SvelteKit的SSR(服务端渲染)能力选就行:
- 方案A(轻量小项目首选):静态导出+Django单服务托管
如果你不需要SvelteKit的服务端逻辑、SSR、边缘函数这些特性,直接把SvelteKit的适配器换成@sveltejs/adapter-static,执行build命令导出纯静态文件,把编译后的产物丢到Django的static和templates目录下,配置一条通配路由,所有非/api/开头的请求直接返回Svelte编译出的入口index.html即可。这种方式只需要启动Django一个服务,和你之前用Bootstrap写模板、Django托管静态文件的逻辑完全一致,部署成本极低,缺点是用不了SvelteKit的服务端能力。 - 方案B(全特性支持,生产推荐):反向代理分路径转发
如果你要用到SvelteKit的SSR、表单动作、服务端load等能力,就保持两个服务独立运行:Django用gunicorn之类的WSGI服务跑在内网端口,SvelteKit用默认的node适配器打包后跑在内网端口,前面加一层Nginx/Caddy做反向代理:- 所有
/api/开头的请求转发给Django服务 - 其余所有请求转发给SvelteKit的Node服务
这种部署方式下用户访问是同域的,完全没有跨域问题,两个框架的所有特性都能完整使用,是目前社区用的最多的成熟方案。
- 所有
避坑提醒
- 不要尝试把.svelte文件放到Django模板目录混写,两种模板的语法存在大量冲突,后续维护成本极高
- 鉴权逻辑和你之前写Django+Bootstrap的逻辑完全一致:接口加登录校验,生产环境同域下cookie自动携带,不需要额外改逻辑
- 初期不用上来就搞什么SSR、同构渲染,先按前后端接口调用的方式把业务跑通,等对SvelteKit熟悉了再按需调整部署方式即可。
内容的提问来源于stack exchange,提问作者fullstacknoob
相关产品推荐
相关产品推荐

