【发布时间】:2019-12-03 17:44:02
【问题描述】:
我目前正在使用 Django Rest Framework 构建一个 API,并且我想要两个视图集。一个与我的用户模型相关,一个用于验证用户电子邮件的单一路由(您将当前有效的令牌发布到端点)。所以它看起来像这样:
- UserViewSet,允许POST、GET、PUT、PATCH、DELETE
- 验证用户视图集,它只允许 POST
在我的路由器中,这是我的配置:
router = routers.DefaultRouter()
router.register("users", UserViewSet, "users")
router.register("users/verify", VerifyUserViewset, "users/verify")
我的问题如下:“users/verify”允许 GET 请求(当它不应该),因为它以“request”作为用户 ID 的“users”端点。
如果我更改路由器中的顺序,则“用户”仅接受 POST,因为端点以“用户/验证”为目标。这似乎正在发生,因为它们共享相同的 url 部分 “users”。
有没有办法绕过这种行为,这样它们就不会在不更改端点 url 的情况下重叠?
谢谢
编辑
序列化器:
class VerifyUserSerializer(serializers.ModelSerializer):
# ----------------------------------------
# Meta, create, update
# ----------------------------------------
class Meta:
model = UserProfile
fields = ["verification_token"]
# ----------------------------------------
# Custom Validation
# ----------------------------------------
def validate_verification_token(self, token):
"""Makes the token required and compare its value to the database"""
# Check empty
message = gettext("'verification_token' is required")
token = is_empty(token, message)
# Find matching user
user = try_get_object(UserProfile, verification_token=token)
if not user:
message = gettext("Invalid Verification Token")
raise serializers.ValidationError(message)
# Return unchanged
return token
视图集:
class VerifyUserViewset(viewsets.GenericViewSet):
# ----------------------------------------
# Settings
# ----------------------------------------
permission_classes = (permissions.AllowAny, )
serializer_class = VerifyUserSerializer
# ----------------------------------------
# Actions
# ----------------------------------------
def create(self, request, *args, **kwargs):
"""POST: Verify the user using its token"""
# Form validation
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
# Validate the user
token = serializer.validated_data["verification_token"]
user = UserProfile.objects.get(verification_token=token)
user.validation_email_verification()
return Response(None, status=status.HTTP_202_ACCEPTED)
【问题讨论】:
-
您可以添加您的
VerifyUserViewset吗? -
我已经编辑了我的帖子并添加了 Serializer 和 ViewSet
标签: django django-rest-framework