【问题标题】:*SOLVED* Endpoints sharing part of an URL*已解决*端点共享 URL 的一部分
【发布时间】: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


【解决方案1】:

我在 Django Rest Framework API 指南中找到了解决方案:https://www.django-rest-framework.org/api-guide/routers/#routing-for-extra-actions

由于我有一个“users/”端点并且想要使用一个“users/verify/”端点,我必须向我的 UserViewset(绑定到“users/”的那个)添加一个 action指向 /verify/。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2012-02-08
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多