DRF面试核心知识点与实战技巧解析
2026/7/22 2:17:24 网站建设 项目流程

1. DRF面试核心知识点解析

Django REST framework(DRF)作为Django生态中最流行的RESTful API开发框架,已成为Python后端开发的标配技能。笔者在技术面试中经常遇到候选人DRF基础不扎实的情况,这里系统梳理了28个高频考点,并附上深度解析。

1.1 RESTful规范的本质与实践

RESTful不是一种技术,而是一套架构约束条件。其核心在于"资源"和"状态转移":

  1. 资源标识:URI应使用名词而非动词,如/articles/而非/get_articles/
  2. 统一接口:HTTP方法语义化
    • GET:获取资源
    • POST:创建资源
    • PUT:全量更新
    • PATCH:局部更新
    • DELETE:删除资源
  3. 状态码规范
    • 200系列:成功状态
    • 400系列:客户端错误
    • 500系列:服务端错误

实际项目中常见的反模式是滥用POST方法。我曾见过一个电商API所有操作都用POST,连商品查询都是POST/get_product,这完全违背了REST原则。

1.2 DRF核心组件工作流

DRF的魔法在于其组件化设计,理解执行流程至关重要:

请求流程: 1. APIView.dispatch() 2. 初始化request对象(封装Django原生request) 3. 执行initial()方法: - 版本控制(determine_version) - 认证(perform_authentication) - 权限检查(check_permissions) - 限流(check_throttles) 4. 反射调用对应的HTTP方法处理

认证组件典型实现:

from rest_framework.authentication import BaseAuthentication class JWTAuthentication(BaseAuthentication): def authenticate(self, request): token = request.META.get('HTTP_AUTHORIZATION') if not token: return None try: payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256']) user = User.objects.get(id=payload['user_id']) return (user, token) except Exception: raise AuthenticationFailed('认证失败')

2. DRF高级特性剖析

2.1 视图类继承体系深度解读

DRF提供了三级视图抽象,适应不同复杂度需求:

  1. APIView:基础视图类

    • 提供请求/响应封装
    • 包含认证/权限等基础功能
    • 需要手动实现各HTTP方法
  2. GenericAPIView:增加了通用查询集处理

    • 标准化的queryset/serializer获取方式
    • 分页/过滤支持
    • 需要配合Mixin使用
  3. ViewSet:路由映射优化

    • 自动关联HTTP方法与动作
    • 支持Router自动注册URL
    • 典型配置:
class UserViewSet(ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer permission_classes = [IsAdminUser] router = DefaultRouter() router.register(r'users', UserViewSet)

2.2 序列化器的进阶用法

序列化器(Serializer)是DRF的数据转换核心,实际开发中这些技巧很实用:

  1. 动态字段控制
class ProductSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): fields = kwargs.pop('fields', None) super().__init__(*args, **kwargs) if fields: allowed = set(fields) existing = set(self.fields) for field in existing - allowed: self.fields.pop(field)
  1. 嵌套序列化优化
class CategorySerializer(serializers.ModelSerializer): products = serializers.SerializerMethodField() def get_products(self, obj): return ProductSerializer( obj.product_set.all()[:5], many=True, fields=('id', 'name') ).data
  1. 自定义校验逻辑
def validate_price(value): if value < 0: raise serializers.ValidationError("价格不能为负") return value class OrderSerializer(serializers.Serializer): price = serializers.FloatField(validators=[validate_price])

3. 生产环境实战经验

3.1 性能优化方案

DRF在高压环境下容易成为性能瓶颈,这些优化手段很有效:

  1. 查询优化

    • 使用select_related/prefetch_related
    • 延迟加载大字段
    • 分页控制数据量
  2. 缓存策略

from django.core.cache import cache class ProductViewSet(viewsets.ModelViewSet): @method_decorator(cache_page(60*15)) def list(self, request): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
  1. 异步支持
from asgiref.sync import sync_to_async @sync_to_async def get_serializer_data(queryset): serializer = ProductSerializer(queryset, many=True) return serializer.data class AsyncProductView(APIView): async def get(self, request): queryset = await sync_to_async(Product.objects.all)() data = await get_serializer_data(queryset) return Response(data)

3.2 安全防护要点

  1. 认证加固

    • JWT设置合理过期时间
    • 敏感操作要求二次认证
    • 实现IP频率限制
  2. 输入验证

class SafeSerializer(serializers.ModelSerializer): def validate(self, data): if script_pattern.search(data.get('content', '')): raise serializers.ValidationError("包含非法字符") return data
  1. CORS安全配置
CORS_ALLOWED_ORIGINS = [ "https://example.com", "https://sub.example.com", ] CORS_ALLOW_METHODS = [ 'GET', 'OPTIONS', 'POST', ]

4. 高频面试题精讲

4.1 JWT实现细节

JWT(JSON Web Token)的三大组成部分:

  1. Header:算法和类型
{ "alg": "HS256", "typ": "JWT" }
  1. Payload:业务数据
{ "user_id": 123, "exp": 1767225600, "iat": 1767129600 }
  1. Signature:签名验证
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )

实际开发中的坑:

  • 不要存储敏感信息
  • 必须设置合理过期时间
  • 需要实现token刷新机制

4.2 限流算法对比

DRF内置两种限流方式:

  1. AnonRateThrottle:基于IP限制匿名用户
class CustomAnonRateThrottle(AnonRateThrottle): rate = '100/day'
  1. UserRateThrottle:基于用户ID限制
class BurstRateThrottle(UserRateThrottle): scope = 'burst' class SustainedRateThrottle(UserRateThrottle): scope = 'sustained'

自定义滑动窗口限流:

from django.core.cache import caches class SlidingWindowThrottle: def __init__(self): self.cache = caches['throttling'] def allow_request(self, request, view): ident = self.get_ident(request) now = time.time() window = 60 # 60秒窗口 key = f'throttle_{ident}' history = self.cache.get(key, []) while history and history[-1] <= now - window: history.pop() if len(history) >= 10: # 10次/分钟 return False history.insert(0, now) self.cache.set(key, history, window) return True

4.3 版本控制方案

DRF支持多种版本控制方式:

  1. URL路径版本(最常用)
REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', 'ALLOWED_VERSIONS': ['v1', 'v2'], 'DEFAULT_VERSION': 'v1' } # urls.py path('api/<version>/users/', UserView.as_view())
  1. 请求头版本(更隐蔽)
class HeaderVersioning(versioning.AcceptHeaderVersioning): header = 'X-API-Version' # 请求头 X-API-Version: 1.0
  1. 查询参数版本(调试方便)
class QueryParameterVersioning(versioning.QueryParameterVersioning): parameter = 'ver' # 请求URL /api/users/?ver=1.0

实际项目建议同时支持多种方式,优先级从高到低:URL路径 > 请求头 > 查询参数。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询