Quasar+Axios与DRF前后端请求处理全指南
Quasar+Axios与DRF前后端请求处理全指南
一、请求处理基础流程
1. 前端请求发起(Quasar+Axios)
// Axios请求示例
const api = axios.create({
baseURL: process.env.API_BASE_URL,
timeout: 30000,
headers: {
'Content-Type': 'application/json' // 默认JSON格式
}
});
// 发起POST请求
async function submitData(data) {
return await api.post('/api/resources/', data);
}
核心要素:
- URL:后端API端点(如/api/resources/)
- 请求方法:GET/POST/PUT/DELETE等
- 请求头:包含认证令牌、数据格式等元信息
- 请求体:JSON格式的业务数据(POST/PUT请求)
2. 后端请求解析(DRF)
DRF通过Request对象统一封装请求信息:
class ResourceViewSet(viewsets.ModelViewSet):
def create(self, request):
# 请求头(Django标准化处理后)
auth_header = request.META.get('HTTP_AUTHORIZATION') # 认证令牌
content_type = request.META.get('CONTENT_TYPE') # 数据格式
# 请求体(DRF自动解析)
payload = request.data # JSON解析后的Python字典
username = payload.get('username')
# 查询参数
page = request.query_params.get('page', 1)
二、请求头与请求体映射规则
1. 请求头转换机制
Django对HTTP请求头的标准化处理规则:
前端请求头 |
DRF后端获取方式 |
转换逻辑 |
Authorization |
request.META['HTTP_AUTHORIZATION'] |
添加HTTP_前缀,连字符转下划线,全大写 |
X-Request-ID |
request.META['HTTP_X_REQUEST_ID'] |
同上(自定义头通用规则) |
Content-Type |
request.META['CONTENT_TYPE'] |
标准头无HTTP_前缀 |
Content-Length |
request.META['CONTENT_LENGTH'] |
同上(标准头特殊处理) |
示例:
前端发送X-Enterprise-ID: ENT123→ 后端通过request.META['HTTP_X_ENTERPRISE_ID']获取。
2. 请求体解析规则
DRF根据Content-Type自动选择解析器:
Content-Type |
解析器 |
后端获取方式 |
适用场景 |
application/json |
JSONParser |
request.data |
结构化数据(推荐默认格式) |
application/x-www-form-urlencoded |
FormParser |
request.data |
简单表单提交 |
multipart/form-data |
MultiPartParser |
request.data+request.FILES |
文件上传 + 表单数据 |
三、企业级核心实践
1. 认证与授权体系
JWT认证流程:
1. 前端:登录成功后存储JWT令牌,请求时自动附加
// Axios请求拦截器自动添加令牌
api.interceptors.request.use(config => {
const token = localStorage.getItem('jwt_token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
2. 后端:验证令牌并绑定用户
# settings.py 配置JWT认证
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
]
}
# 视图中访问认证用户
class ProtectedView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({'user': request.user.username}) # 已认证用户
2. 分布式追踪与请求ID
全链路追踪实现:
1. 前端:生成UUID作为X-Request-ID头
import { v4 as uuidv4 } from 'uuid';
api.interceptors.request.use(config => {
config.headers['X-Request-ID'] = uuidv4(); // 生成唯一追踪ID
return config;
});
2. 后端:透传并记录请求ID
# 中间件记录请求ID
class RequestIDMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
request_id = request.META.get('HTTP_X_REQUEST_ID', 'N/A')
# 日志中携带请求ID
logger.info(f"[{request_id}] Processing {request.method} {request.path}")
response = self.get_response(request)
response['X-Request-ID'] = request_id # 响应头透传
return response
3. 错误处理标准化
结构化错误响应:
- 后端:统一异常格式
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None:
response.data = {
'error': {
'code': getattr(exc, 'default_code', 'error'),
'message': str(exc),
'details': response.data # 字段级错误详情
}
}
return response
- 前端:拦截器统一处理
api.interceptors.response.use(
response => response,
error => {
const err = error.response?.data?.error || { message: '未知错误' };
// 分类处理
if (error.response?.status === 401) {
router.push('/login'); // 未授权跳转登录
} else {
Notify.create({ type: 'negative', message: err.message });
}
return Promise.reject(err);
}
);
4. 安全加固措施
安全风险 |
防护措施 |
未授权访问 |
使用JWT/OAuth2认证,配合DRF权限类(IsAuthenticated,DjangoModelPermissions) |
跨站请求伪造 |
Session认证时启用CSRF保护;JWT认证可豁免(需确保令牌安全存储) |
数据泄露 |
敏感字段脱敏(如手机号138****5678),响应头添加Content-Security-Policy |
请求过大攻击 |
Nginx配置client_max_body_size 10M限制请求体大小 |
四、性能与监控最佳实践
1. 请求性能优化
- 前端:启用Axios请求缓存、压缩请求数据
// 请求缓存示例
const cache = new Map();
async function getCachedData(url) {
if (cache.has(url)) return cache.get(url);
const response = await api.get(url);
cache.set(url, response.data); // 缓存结果
return response.data;
}
- 后端:优化序列化器、添加数据库索引、使用缓存(Redis)
- 请求耗时记录:
2. 全链路监控
# 后端中间件记录耗时
class PerformanceMiddleware:
def __call__(self, request):
start_time = time.perf_counter()
response = self.get_response(request)
duration = (time.perf_counter() - start_time) * 1000 # 毫秒
logger.info(f"Request duration: {duration:.2f}ms")
return response
- APM工具集成:接入Sentry监控错误,Datadog跟踪性能指标
五、典型场景示例:用户登录流程
1. 前端实现
async function login(credentials) {
try {
const response = await api.post('/auth/token/', credentials);
const { access, refresh } = response.data;
// 存储令牌(生产环境建议使用HttpOnly Cookie)
localStorage.setItem('access_token', access);
localStorage.setItem('refresh_token', refresh);
return true;
} catch (error) {
Notify.create({ message: '用户名或密码错误' });
return false;
}
}
2. 后端实现
# urls.py
path('auth/token/', TokenObtainPairView.as_view(), name='token_obtain_pair')
# 视图逻辑(DRF内置)
# 1. 验证用户名密码
# 2. 生成JWT令牌对(access/refresh)
# 3. 返回令牌:{"access": "...", "refresh": "..."}
3. 流程说明
1. 前端提交{username, password}到/auth/token/
2. 后端验证通过后返回JWT令牌对
3. 前端存储令牌并在后续请求头中携带Authorization: Bearer <access_token>
六、企业级架构建议
1. 多层请求处理架构
客户端 → CDN → API网关 → 后端服务
- 网关层:Nginx/Kong处理路由、限流、SSL终止
- 应用层:DRF中间件处理认证、审计、监控
2. 跨域配置(CORS)
# settings.py
INSTALLED_APPS = ['corsheaders']
MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware']
CORS_ALLOWED_ORIGINS = [
"https://app.example.com", # 生产环境限定域名
]
CORS_ALLOW_CREDENTIALS = True # 允许跨域携带Cookie
3. API契约管理
- 使用OpenAPI/Swagger定义接口规范
- 前后端并行开发时通过Mock Server验证请求/响应格式
本指南覆盖企业级前后端请求处理的核心流程、安全实践和性能优化策略,可作为Quasar+DRF技术栈的标准化开发参考。实际落地时需结合业务场景补充数据校验、日志审计等定制化需求。