Django后端以API形式构建时能否渲染模板?登录Token如何处理?
关于Django与DRF混合开发及Token使用的问题解答
1. 能否同时用DRF构建API和Django模板渲染前端?
完全可以,Django本身就支持这种混合开发模式,不需要在两种方式中二选一:
- 你可以在同一个项目里,一部分视图用普通的
Django View或TemplateView来渲染模板(也就是你熟悉的传统Django开发方式),另一部分用DRF的APIView或ViewSet编写接口,供前端JS或其他外部服务调用。 - 举个简单的代码示例:
- 普通模板视图:
from django.views.generic import TemplateView class HomePage(TemplateView): template_name = 'home.html' - DRF API视图:
from rest_framework.views import APIView from rest_framework.response import Response class UserListAPI(APIView): def get(self, request): users = [{'username': 'alice'}, {'username': 'bob'}] return Response(users) - 路由配置(两者互不干扰):
from django.urls import path from .views import HomePage, UserListAPI urlpatterns = [ path('', HomePage.as_view(), name='home'), path('api/users/', UserListAPI.as_view(), name='user-list-api'), ]
- 普通模板视图:
- 这种模式很适合渐进式改造项目,或者部分页面需要复杂交互、部分页面仅需静态渲染的场景。
2. Token的处理及用途
Token并不是只给其他软件用的,它和用户身份密切相关:
- 核心作用:Token是验证用户身份的凭证,替代传统的Session-Cookie模式,既适用于第三方服务调用你的API,也适用于你自己的前端页面通过JS调用DRF接口时的身份验证。
- 用户登录后的Token处理:
- 用户通过登录接口(比如DRF自带的
ObtainAuthToken视图)提交用户名密码后,后端会返回一个Token字符串。 - 如果你用Django模板渲染前端,可以把Token存在前端的
localStorage、sessionStorage或者Cookie中。 - 之后前端每次调用需要权限的DRF接口时,要在请求头里带上Token:
Authorization: Token <你的Token字符串>,DRF就能通过这个Token识别当前请求的用户身份。
- 用户通过登录接口(比如DRF自带的
- 前端JS调用示例(嵌入在模板页面中):
// 登录获取Token async function login(username, password) { const response = await fetch('/api/auth/login/', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username, password }), }); const data = await response.json(); if (data.token) { localStorage.setItem('authToken', data.token); // 存储Token } } // 携带Token调用API async function getCurrentUser() { const token = localStorage.getItem('authToken'); const response = await fetch('/api/user/profile/', { headers: { 'Authorization': `Token ${token}`, }, }); return await response.json(); } - 注意事项:
- Token存在前端时要注意安全,比如全程用HTTPS传输,避免XSS攻击;如果涉及敏感操作,可以使用短有效期Token并配合刷新机制。
- 如果你只是用Django模板渲染页面,不需要调用DRF接口,那完全可以不用Token,继续使用Django自带的Session认证即可——Token主要是为无状态的API调用场景设计的。
内容的提问来源于stack exchange,提问作者ekireh
相关产品推荐
相关产品推荐

