当前位置: 首页 > 知识库问答 >
问题:

如何在Swagger UI中使用带有Django Rest框架的viewsets和一个post方法传递参数,而不需要任何模型?

孙帅
2023-03-14

我需要做一个api来做某种逻辑(例如:处理一些数据,生成一个wordcloud,做一个ml层……)并返回简单状态。在我想做的逻辑中,我不需要模型,只需要接收一个带有一些参数的json,然后做我想做的事情。

我刚刚创建了api视图,但是我找不到在主体中接收参数的方法。

我读到了一个很好的模式来设计我的方法(Django Rest框架业务逻辑,Django中业务逻辑和数据访问的分离),我在api.py文件中编写了代码。我没有为这个视图使用序列化器,因为我不需要从模型中使用数据,相反,我使用输入JSON。

api.py

from rest_framework import viewsets
from rest_framework import views
from rest_framework import status
from rest_framework.response import Response
from rest_framework_swagger.views import get_swagger_view

class WordCloudViewSet(viewsets.ViewSet):

    def create(self, request, *args, **kwargs):
        comments_list = kwargs['data']['comments']
        user_id = kwargs['data']['user_id']
        '''
        some logic
        '''
        return Response(status=status.HTTP_200_OK)

urls.py

from django.conf.urls import include, url
from rest_framework import routers
from .api import (WordCloudViewSet)
from api import views

router = routers.DefaultRouter()

schema_view = get_swagger_view(title='Swagger Documentation')

urlpatterns = [
    url(r'^api/wordcloud/', WordCloudViewSet.as_view({'get': 'list', 'post':'create'}), name='wordcloud')
]

urlpatterns += router.urls

我尝试在postman中按正文发送一个json,如下所示:

{
    "data": {
        "comments": ["Lorem ipsum dolor sit amet"],
        "user_id": 1
    }
}

我如何在WordCloudViewSet中指定参数,通过post请求输入参数,而不使用模型?

感谢您的关注,并提前感谢您的回复。

编辑

令人惊讶的是,我没有尝试使用request.data而它却起作用了。但是,在swagger UI中,我不能像前面的评论那样测试我的api,因为它没有显示一个输入标签来发送请求。

共有1个答案

禄源
2023-03-14

最后,我找到了一个简单的解决方案,我只需要更改url就可以了,从这个:

urlpatterns = [
    url(r'^api/wordcloud/', WordCloudViewSet.as_view({'get': 'list', 'post':'create'}), name='wordcloud')
]

对此:

urlpatterns = [
    url(r'^api/wordcloud/comments/<string:comments>/user_id/<int:user_id>', WordCloudViewSet.as_view({'get': 'list', 'post':'create'}), name='wordcloud')
]

其他有相同问题的人的另一个建议是,即使我不需要使用模型中的数据,我也更喜欢使用序列化器,仅用于必需的和可选的参数验证:

在Serializers.py中

class WordCloudAPISerializer(serializers.ModelSerializer):
    comments = serializers.CharField(required=True)
    user = serializers.IntegerField(source='id',required=False)
    class Meta:
        model = User
        fields = ('comments','user')

    def to_internal_value(self, data):
        required = []
        optionals = []
        for k in ['comments']:
            '''
            - Case 1: Is the k field in the data and it's empty?
            - Case 2: Is not the k field in the data?
            '''
            if (data.keys().__contains__(k) and data[k] == '') or (not data.keys().__contains__(k)):
                required.append(k)

        for k in ['user']:
            # Is not the k field in the data?
            if not data.keys().__contains__(k):
                optionals.append(k)

        if len(required) > 0 and len(optionals) > 0:
            raise ValueError("The following fields are required: %s" % ','.join(required) + " and the following fields are needed but can be empty: %s" % ','.join(optionals))

        elif len(required) > 0 and len(optionals) == 0:
            raise ValueError("The following fields are required: %s" % ','.join(required))

        elif len(required) == 0 and len(optionals) > 0:
            raise ValueError("The following fields are needed but can be empty: %s" % ','.join(optionals))

        return data

然后在api.py中

            serializer = WordCloudAPISerializer(data=kwargs['data'])
            if serializer.is_valid():
                '''some logic'''
            else:
                return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

我希望这能对其他人有用。

 类似资料:
  • 我有一个JSON数据文件 首先,我想读取这个数据,当wheels.value==Yes时,我想点击一个API,否则点击另一个API,我想知道如何在post请求中或从文件中传递多个参数。 Post请求数据如下: 上面的数据我正在邮递员中传递“表单-数据”。 提前致谢

  • 问题内容: 我已经按照此链接中所述的教程进行操作。在下面的代码中,由于某种原因,数据不会作为参数附加到url上,但是如果我使用它直接将其设置为url 则可以。 问题答案: 对于简单的情况,我建议您使用jQuery 的或语法: 如果您需要捕获失败案例,请执行以下操作: 此外,如果您始终发送JSON字符串,则可以在最后使用$ .getJSON 或$ .post以及另一个参数。

  • 我只想传递一个lambda(代码块),并在需要时执行它。如何在下面的代码中实现方法(以及方法签名是什么):

  • 使用PowerMockito模拟私有方法的泛型参数的正确方法是什么?

  • 本文向大家介绍在多个页面之间需要传递参数,你是如何传递这些参数的?相关面试题,主要包含被问及在多个页面之间需要传递参数,你是如何传递这些参数的?时的应答技巧和注意事项,需要的朋友参考一下 form表单,url查询参数,request参数,session,cookie 参考文章

  • 问题内容: 我使用window.open方法打开了带有参数的新站点,我必须通过post方法来传递它。我找到了解决方案,但不幸的是它不起作用。这是我的代码: 接下来,我创建数组: 并通过以下方式调用函数: 但是,当我单击此按钮时,站点test.asp为空(当然,我尝试获取传递值- )。 我怎么解决这个问题,为什么我不能获得通过值? 问题答案: 无需将表单写入新窗口(要用HTML代码中的值进行编码就很