eagleye

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技术栈的标准化开发参考。实际落地时需结合业务场景补充数据校验、日志审计等定制化需求。

 

posted on 2025-07-18 19:05  GoGrid  阅读(36)  评论(0)    收藏  举报

导航