django如何使用DRF的`APIView`或者`@api_view`装饰器来处理请求


实现步骤

  1. 引入必要的模块和类。
  2. 把函数参数从req改为request,这是DRF视图函数的标准参数名。
  3. 采用DRF的APIView或者@api_view装饰器来处理请求。
  4. 对异常处理逻辑进行优化,明确捕获特定异常并返回合适的错误信息。
  5. 运用DRF的Response类来返回格式化后的数据。

代码示例

下面是修改后的代码:

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. 错误处理优化

    • 捕获特定异常并记录错误日志,方便后续排查问题。
    • 返回符合统一格式的错误响应,包含codemessagedata字段。
  4. 响应格式统一
    按照之前讨论的格式,将数据包裹在{"data": ..., "code": ..., "message": ...}结构中。
  5. 权限设置
    使用@permission_classes([AllowAny])允许未认证用户访问该接口,你可以根据实际需求调整权限。

注意事项

  • 要保证get_setting_config()函数能够正确处理并返回预期的数据结构。
  • 在生产环境中,建议移除@csrf_exempt或者确保有其他的CSRF保护机制。
  • 可以根据项目的日志配置,对错误日志的记录方式进行调整。

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - django如何使用DRF的`APIView`或者`@api_view`装饰器来处理请求


欢迎来到我的小屋