SvelteKit对接独立REST API:请求应放在+page.ts还是+page.server.ts?会话认证场景该如何处理?
SvelteKit对接独立REST API:请求应放在+page.ts还是+page.server.ts?会话认证场景该如何处理?
嘿,这个问题问得特别戳中SvelteKit新手对接后端的痛点,我来给你理得明明白白~
首先得搞懂这两个文件的核心区别,再结合你的场景选:
一、选+page.ts还是+page.server.ts?
这俩的本质差异是运行环境不同:
- +page.ts:属于「通用代码」,SSR开启时会在服务器端和客户端都跑。
适合请求公开无敏感信息的数据,比如首页的文章列表、商品展示页数据。好处是用户首次刷新页面时,服务器端会先请求API渲染出完整页面(吃满SSR的优势),后续客户端导航时就直接在浏览器发请求,不用绕服务器,速度更快。但缺点是API地址会暴露在前端代码里,绝对不能放需要敏感认证信息的请求——毕竟前端能扒到所有代码。 - +page.server.ts:属于「服务器专属代码」,只在SvelteKit的服务器端运行,完全不会碰浏览器。
这才是处理需要认证、带敏感信息请求的首选。比如你要调取Django的会话认证接口,或者需要传递API密钥(如果有的话),放这里绝对安全,因为这些敏感数据根本不会暴露给前端。另外,要是你的Django API和SvelteKit不在同一个域名下,服务器端请求不存在跨域问题,不用在前端折腾CORS配置,省心太多。
结合你的情况:如果是公开数据请求,两种都能选;但涉及会话认证的话,果断选+page.server.ts。
二、会话认证场景的具体处理
你用的是Django的Session Auth,核心是浏览器里的sessionid cookie——用户登录后Django会把这个cookie存在浏览器,后续请求会自动带上。但如果是在SvelteKit服务器端发请求(也就是+page.server.ts里的fetch),得手动把客户端的cookie传给Django API,具体操作如下:
在+page.server.ts的load函数里,通过cookies对象拿到客户端的sessionid,然后在fetch请求里带上这个cookie:
export async function load({ fetch, cookies }) { // 从客户端请求中获取sessionid cookie const sessionId = cookies.get('sessionid'); // 调用Django的受保护API,带上sessionid const response = await fetch('https://你的DjangoAPI地址/api/protected-data/', { headers: { 'Cookie': `sessionid=${sessionId}` } }); // 处理响应数据 const protectedData = await response.json(); return { protectedData }; }
额外注意点:
- 如果Django和SvelteKit是子域名关系(比如SvelteKit在
example.com,Django在api.example.com),要确保Django设置的cookie的Domain属性包含父域名,这样SvelteKit服务器才能拿到这个cookie。 - 要是完全不同域名,其实用+page.server.ts中转的话,根本不用管前端的CORS配置——因为是SvelteKit服务器发请求给Django,不存在跨域限制。
- 如果你非要在客户端(比如+page.ts或组件里)发认证请求,记得把fetch的
credentials设为include,这样浏览器会自动带上sessionid,但前提是Django要开启CORS_ALLOW_CREDENTIALS = True,还要配置允许的域名,这种方式不如服务器端中转安全,不推荐。
总结一下:
- 公开数据:优先+page.ts,兼顾SSR和客户端性能;
- 认证/敏感请求:必须+page.server.ts,安全还省跨域麻烦;
- 会话认证时,在+page.server.ts里通过
cookies拿sessionid传给Django就行。
备注:内容来源于stack exchange,提问作者kevlar
相关产品推荐
相关产品推荐

