定制django-rest-framework响应

使用django-rest-framework可以非常方便的基于django实现Restful API,但通常各个公司都会有各自的Restful API接口规范,可能会与框架默认的不太一样,这时候就需要能定制一下响应的格式。

借助于django的类继承机制,django-rest-framework提供了非常灵活的方式来实现,代码如下:

# coding: utf-8
from rest_framework import exceptions
from rest_framework import status, viewsets
from rest_framework.response import Response


class CustomModelViewSet(viewsets.ModelViewSet):
    def handle_exception(self, exc):
        """
        Handle any exception that occurs, by returning an appropriate response,
        or re-raising the error.
        """
        if isinstance(exc, (exceptions.NotAuthenticated,
                            exceptions.AuthenticationFailed)):
            # WWW-Authenticate header for 401 responses, else coerce to 403
            auth_header = self.get_authenticate_header(self.request)
            if auth_header:
                exc.auth_header = auth_header
            else:
                exc.status_code = status.HTTP_403_FORBIDDEN
        exception_handler = self.settings.EXCEPTION_HANDLER
        context = self.get_exception_handler_context()
        response = exception_handler(exc, context)
        if response is None:
            self.raise_uncaught_exception(exc)
        response.exception = True
        response.data = {
            'msg': response.data.values()[0][0],
            'code': response.status_code,
            'data': {}
        }
        response.status_code = status.HTTP_200_OK
        return response

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(
            {
                "msg": "create success",
                "code": 200,
                "data": {
                    "detail": serializer.data
                }
            },
            status=status.HTTP_201_CREATED,
            headers=headers
        )

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(
            {
                "msg": "retrieve success",
                "code": 200,
                "data": {
                    "detail": serializer.data
                }
            }
        )

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, '_prefetched_objects_cache', None):
            # If 'prefetch_related' has been applied to a queryset, we need to
            # refresh the instance from the database.
            instance = self.get_object()
            serializer = self.get_serializer(instance)

        return Response(
            {
                "msg": "update success",
                "code": 200,
                "data": {
                    "detail": serializer.data
                }
            }
        )

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        data = serializer.data
        self.perform_destroy(instance)
        return Response(
            {
                "msg": "destroy success",
                "code": 200,
                "data": {
                    "detail": data
                }
            }
        )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django REST Framework Cache是一个Django框架的扩展,用于缓存REST API响应数据。它提供了一种简单的方式来缓存API视图的响应,以减少数据库查询和加快请求的响应速度。 使用Django REST Framework Cache,你可以通过在视图类或视图函数上添加装饰器来启用缓存。这个扩展支持多种缓存后端,包括内存缓存、数据库缓存和文件缓存等。你可以根据你的需求选择适合的缓存后端。 为了使用Django REST Framework Cache,你需要在你的Django项目中安装并配置它。你可以通过pip安装它: ``` pip install djangorestframework-cache ``` 安装完成后,在你的项目的settings.py文件中添加以下配置: ```python INSTALLED_APPS = [ ... 'rest_framework_cache', ] CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } REST_FRAMEWORK_CACHE = { 'DEFAULT_CACHE_BACKEND': 'default', } ``` 然后,在你的API视图类或函数上使用`@cache_response`装饰器来启用缓存: ```python from rest_framework.decorators import api_view from rest_framework_cache.decorators import cache_response @api_view(['GET']) @cache_response(timeout=60*60*24) # 缓存一天 def my_view(request): ... ``` 这样,当该API被访问时,响应数据将会被缓存,并在下次请求相同的API时直接返回缓存的响应数据,而不需要执行相同的查询操作。 通过使用Django REST Framework Cache,你可以有效地提高REST API的性能和响应速度,并减少对数据库的负载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值