django如何使用DRF的`APIView`或者`@api_view`装饰器来处理请求 最后更新时间:2025年07月02日 ### 实现步骤 1. 引入必要的模块和类。 2. 把函数参数从`req`改为`request`,这是DRF视图函数的标准参数名。 3. 采用DRF的`APIView`或者`@api_view`装饰器来处理请求。 4. 对异常处理逻辑进行优化,明确捕获特定异常并返回合适的错误信息。 5. 运用DRF的`Response`类来返回格式化后的数据。 ### 代码示例 下面是修改后的代码: ```python from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework import status @api_view(['GET']) # 明确指定支持的HTTP方法 @permission_classes([AllowAny]) # 设置权限,这里允许任何用户访问 用于跳过jwt认证 @csrf_exempt # 如果你确实需要禁用CSRF保护 def get_setting_img(request): rsp_data = {} try: set_data = get_setting_config() if set_data: rsp_data['enterprise_logo'] = set_data.get('enterprise_logo') rsp_data['enterprise_bg'] = set_data.get('enterprise_bg') rsp_data['cancel_registration'] = set_data.get('cancel_registration') # 如果set_data为空,返回空的rsp_data(根据业务需求调整) return Response({ 'data': rsp_data, 'code': 200, 'message': '获取成功' }, status=status.HTTP_200_OK) except Exception as e: # 记录错误日志 import logging logger = logging.getLogger(__name__) logger.error(f"获取设置图片失败: {str(e)}") # 返回错误响应 return Response({ 'data': None, 'code': 500, 'message': '获取失败,请稍后重试' }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) ``` ### 关键修改点说明 1. **导入必要的模块**: 引入了`api_view`装饰器、`AllowAny`权限类以及`status`模块,为使用DRF的功能做好准备。 2. **使用`@api_view`装饰器**: 替代了原来的`@csrf_exempt`,这样能更规范地处理HTTP方法,同时正确处理DRF的请求和响应。 3. **错误处理优化**: - 捕获特定异常并记录错误日志,方便后续排查问题。 - 返回符合统一格式的错误响应,包含`code`、`message`和`data`字段。 4. **响应格式统一**: 按照之前讨论的格式,将数据包裹在`{"data": ..., "code": ..., "message": ...}`结构中。 5. **权限设置**: 使用`@permission_classes([AllowAny])`允许未认证用户访问该接口,你可以根据实际需求调整权限。 ### 注意事项 - 要保证`get_setting_config()`函数能够正确处理并返回预期的数据结构。 - 在生产环境中,建议移除`@csrf_exempt`或者确保有其他的CSRF保护机制。 - 可以根据项目的日志配置,对错误日志的记录方式进行调整。
Comments | NOTHING