首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django rest框架自定义返回响应

Django rest框架自定义返回响应
EN

Stack Overflow用户
提问于 2017-12-26 06:58:35
回答 2查看 4.2K关注 0票数 3

所以我有这个自定义注册API来注册一个用户,但是当用户成功注册时,我希望它有这样的消息:“您已经成功注册了一个帐户!”但我尝试了一种不同的方法,但却得到了一个错误。

serializer.py

代码语言:javascript
运行
复制
class UserCreate2Serializer(ModelSerializer):
    email = EmailField(label='Email Address')
    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

    class Meta:
        model = MyUser
        fields = ['username', 'password', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
        extra_kwargs = {"password": {"write_only": True}}

    def validate(self, data):  # to validate if the user have been used
        email = data['email']
        user_queryset = MyUser.objects.filter(email=email)
        if user_queryset.exists():
            raise ValidationError("This user has already registered.")
        return data

    def create(self, validated_data):
        username = validated_data['username']
        password = validated_data['password']
        email = validated_data['email']
        first_name = validated_data['first_name']
        last_name = validated_data['last_name']
        gender = validated_data['gender']
        nric = validated_data['nric']
        birthday = validated_data['birthday']
        birthTime = validated_data['birthTime']

        user_obj = MyUser(
            username = username,
            email = email,
            first_name = first_name,
            last_name = last_name,
            gender = gender,
            nric = nric,
            birthday = birthday,
            birthTime = birthTime,
        )

        user_obj.set_password(password)
        user_obj.save()
        return validated

views.py

代码语言:javascript
运行
复制
class CreateUser2View(CreateAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserCreate2Serializer
    queryset = MyUser.objects.all()

我试过将其转换为序列化程序。

代码语言:javascript
运行
复制
user_obj.set_password(password)
user_obj.save()
content = {'Message': 'You have successfully register an account'}
return content

但却犯了个错误。我不知道如何进行自定义响应,因为我只知道它是在views.py上完成的。但如果我这么做是有目共睹的

代码语言:javascript
运行
复制
class CreateUser2View(CreateAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserCreate2Serializer
    queryset = MyUser.objects.all()

    def post(self, request):
        content = {'Message': 'You have successfully register'}
        return Response(content, status=status.HTTP_200_OK)

它将显示这一点,即使验证是不正确的。请帮帮我,因为我在DRF方面还没有经验。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-26 07:08:24

代码语言:javascript
运行
复制
class CreateUser2View(CreateAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserCreate2Serializer
    queryset = MyUser.objects.all()

    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({'Message': 'You have successfully register'}, status=status.HTTP_201_CREATED, headers=headers)
票数 11
EN

Stack Overflow用户

发布于 2022-08-26 06:03:29

代码语言:javascript
运行
复制
from rest_framework import status
from rest_framework.views import exception_handler as base_handler


def exception_handler(exception, context):
    """
    Django rest framework for custom exception handler

    @exception  :  Exception
    @context    :  Context
    """
    response = base_handler(exception, context)

    if response is not None:
        response = custom_response(response)

    return response


def serializer_errors(data):
    """
    Django rest framework serializing the errors
    @data  : data is python error dictionary
    """
    errors = {}
    got_msg = False
    message = "Bad request."

    if isinstance(data, dict):
        for key, value in data.items():
            try:
                if isinstance(value, list):
                    value = ", ".join(value)
            except Exception:
                pass

            if not got_msg:
                if value:
                    message = value
                    got_msg = True
            errors[key] = value

    if not isinstance(message, str):
        message = "Bad request"
    return errors, message


def error(source, detail, code):
    """
    Create python dictionary of error
    @source : Where coming the error
    @detail : Error detail information
    """
    error = {}
    error["source"] = source
    error["detail"] = detail
    if code:
        error["code"] = code
    return error


def custom_response(response):
    """
    Modification the response of django rest framework

    @response : Return response
    """
    modified_data = {}
    modified_data["code"] = response.status_code
    modified_data["status"] = get_status(response.status_code)
    data, message = serializer_errors(response.data)
    modified_data["message"] = message
    modified_data["errors"] = data
    response.data = modified_data
    return response


def get_status(status_code):
    """
    Return result base on return http status

    @status_code : HTTP status code
    """
    result = ""

    if status_code == status.HTTP_200_OK:
        result = "Success"
    elif status_code == status.HTTP_201_CREATED:
        result = "Instance create"
    elif status_code == status.HTTP_204_NO_CONTENT:
        result = "Instance deleted"
    elif status_code == status.HTTP_403_FORBIDDEN:
        result = "Forbidden error"
    elif status_code == status.HTTP_404_NOT_FOUND:
        result = "Instance not found"
    elif status_code == status.HTTP_400_BAD_REQUEST:
        result = "Bad request"
    elif status_code == status.HTTP_401_UNAUTHORIZED:
        result = "Unauthorized request"
    elif status_code == status.HTTP_500_INTERNAL_SERVER_ERROR:
        result = "Internal server error"
    else:
        result = "Unknown error"

    return result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47975001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档