简体   繁体   English

在 DRF 中实现自定义响应类

[英]Implementing custom Response class in DRF

my views.py:我的意见.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)

Here above is a snapshot of my current app views.以上是我当前应用程序视图的快照。 I'm working on DRF API and I want to customize the Response class of DRF.我正在研究 DRF API,我想自定义 DRF 的响应类。 I want to call the response with two arguments like 'Reponse(code, token)' as above, where rest API output should be in the format as per the code value shown below:我想用两个参数调用响应,如上面的'Reponse(code, token)' ,其中 rest API 输出应采用如下所示的代码值的格式:

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

                    }
                 }

Is it possible to do so by subclassing 'Response' class in my own class.是否可以通过在我自己的班级中对'Response'类进行子类化来做到这一点。 May be I'm doing it in a wrong way.可能是我做错了。 Please suggest me the possible solution.请建议我可能的解决方案。

Thanks!谢谢! in Advance.提前。

He Paulo, if you want to create your custom response you should: He Paulo,如果您想创建自定义响应,您应该:

  • write your class with parent SimpleTemplateResponse not Response使用父类 SimpleTemplateResponse 而非 Response 编写您的类
  • and pay attention to content_type o fyour reponse并注意您的响应的 content_type

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM