在DRF中实现自定义响应类

问题描述 投票:2回答:1

我的views.py。

class OptiResponse(Response):
    def __init__(self, token=None, code=None, headers=None):
        if code==0:
            if token:
                data = {
                    "status":{
                        "code": 0,
                        "error_message": "" 
                    },
                    "data":{
                        "token":token,
                    }
                }   
            data = {
                    "status":{
                        "code": 0,
                        "error_message": "" 
                    },
                    "data":{

                    }
            }
        data = {
                "status":{
                    "code": 1,
                    "error_message": "" 
                },
                "data":{

            }
        }

        self.token=token
        self.data = data

        if headers:
            for name, value in six.iteritems(headers):
                self[name] = value

    @property
    def rendered_content(self):
        return ret

    @property
    def status_text(self):
        return responses.get(self.status_code, '')

    def __getstate__(self):
        return state


class LoginView(generics.CreateAPIView):
    serializer_class = serializers.LoginSerializer

    """Authenticate and Login a user."""
    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            email = serializer.data['email']
            password = serializer.data['password']
            remember = serializer.data['remember_me']

            user = authenticate(email=email, password=password)

            if user:
                if user.is_active:
                    if remember:
                        request.session.set_expiry(120)

                    login(request, user)
                    token = Token.objects.get(user=user)
                    return OptiResponse(0, token.key)

上面是我当前应用视图的快照。我正在研究DRF API,我想自定义DRF的Response类。我想用两个参数来调用响应,如 'Reponse(code, token)' 如上图,其中其余API输出的格式应该是如下图所示的代码值。

                 {
                    "status":{
                        "code": 0, #either 0 in success or 1 in error.
                        "error_message": "" 
                    },
                    "data":{

                    }
                 }

是否可以通过子类来实现 'Response' 在我自己的班级里。可能是我做的方法不对。请给我建议可能的解决方案。

谢谢!在此先说一句。

python django api rest django-rest-framework
1个回答
0
投票

He Paulo,如果你想创建你的自定义响应,你应该。

  • 用父类SimpleTemplateResponse notResponse来编写你的类。
  • 并注意你的回复的内容_类型。

from django.template.response import SimpleTemplateResponse

class MyCustomResponse(SimpleTemplateResponse):
    def __init__(self,code=None,token=None):


        super(Response, self).__init__(None, status=None)


        """
          PUT YUOR DATA CODES HERE ....
        """


        self.token = token
        self.code = code

        if headers:
            for name, value in six.iteritems(headers):
                self[name] = value

     @property
     def rendered_content(self):
         renderer = getattr(self, 'accepted_renderer', None)
         media_type = 'application/json'
         context = getattr(self, 'renderer_context', None)

         assert renderer, ".accepted_renderer not set on Response"
         assert media_type, ".accepted_media_type not set on Response"
         assert context, ".renderer_context not set on Response"
         context['response'] = self

         content_type = 'application/json'


         self['Content-Type'] = content_type

        ret = renderer.render(self.data, media_type, context)

         if not ret:
             del self['Content-Type']

         return ret
© www.soinside.com 2019 - 2024. All rights reserved.