如何在没有任何模型的情况下使用 Django Rest Framework 的视图集通过 post 方法在 Swagger UI 中传递参数?

2024-01-19

我需要做一个 api 来制作某种逻辑(例如:处理一些数据、生成词云、制作机器学习层...)并返回一个简单的状态。在我想做的逻辑中,我不需要模型,只需要接收带有一些参数的 json 并做我想做的事情。

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

我正在阅读有关设计我的方法的良好模式(Django Rest 框架业务逻辑 https://stackoverflow.com/questions/30197637/django-rest-framework-business-logic, django中业务逻辑和数据访问分离 https://stackoverflow.com/questions/12578908/separation-of-business-logic-and-data-access-in-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

我尝试在邮递员中按正文发送 json,如下所示:

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

但 args 和 kwargs 都是空的。即使在 swagger UI 中,我也看不到发送 json 的参数标签。

我找到的所有示例都使用模型和序列化器。

一个接收并返回“Hello”+名称的简单 Api 视图对我来说就足够了。

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

感谢您的浏览,并提前感谢您的回复。

Edit

令人惊讶的是,我没有尝试过request.data它有效。但是,在 swagger UI 中,我无法在评论之前测试我的 api,因为它没有显示用于发送请求的输入标签。


最后,我找到了一个简单的解决方案,我只需更改网址即可:

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

To this:

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

Then In swagger it display the labels for the parameters: enter image description here

附加信息对于遇到同样问题的任何其他人的另一个建议是,即使我不需要使用模型中的数据,我也更喜欢使用序列化器,仅用于必需和可选参数验证:

In 序列化器.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

Then in api.py

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

我希望这对其他人有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有任何模型的情况下使用 Django Rest Framework 的视图集通过 post 方法在 Swagger UI 中传递参数? 的相关文章

随机推荐