Tôi có điểm cuối API cho phép người dùng đăng ký tài khoản. Tôi muốn trả lại HTTP 409 thay vì 400 cho tên người dùng trùng lặp.Khung làm việc Django REST cách chỉ định mã lỗi khi tăng lỗi xác thực trong bộ nối tiếp
Đây là serializer tôi:
from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer
class UserSerializer(ModelSerializer):
username = CharField()
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise NameDuplicationError()
return value
class NameDuplicationError(APIException):
status_code = status.HTTP_409_CONFLICT
default_detail = u'Duplicate Username'
Khi lỗi được kích hoạt, phản ứng là: {"detail":"Duplicate Username"}
. Tôi nhận ra rằng nếu tôi phân lớp APIException, khóa detail
được sử dụng thay vì username
.
Tôi muốn có phản ứng này để thay thế {"username":"Duplicate Username"}
hoặc tôi muốn chỉ định một mã trạng thái khi nuôi một ValidationError:
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise serializers.ValidationError('Duplicate Username',
status_code=status.HTTP_409_CONFLICT)
return value
Nhưng điều này không làm việc như ValidationError
chỉ trả về 400.
Có cách nào khác để thực hiện việc này không?
Tuyệt vời, tính năng này hoạt động. Hàm này sẽ trở nên rất phức tạp nếu tôi muốn tùy chỉnh ngoại lệ cho các khung nhìn khác nhau. Khi số lượt xem tăng, chức năng này cũng sẽ tăng lên. Tôi tự hỏi nếu có một giải pháp có thể mở rộng. – Cheng
bạn muốn ghi đè 'chi tiết'? –
Ý tôi là nếu có 3 ngoại lệ mà tôi muốn ghi đè, thì tôi sẽ có cấu trúc if..elif..elif trong 'custom_exception_handler'. Tôi muốn tùy chỉnh nhiều ngoại lệ, tôi càng phải viết nhiều hơn bằng phương pháp này. Ngoài ra, tôi cần phải nhớ chi nhánh nào chịu trách nhiệm về hoạt động HTTP của chế độ xem nào. Điều này có thể là một vấn đề thực sự xuống dòng. – Cheng