python-3.x - 如何在没有任何模型的情况下使用带有 Django Rest Framework 的视图集通过 post 方法在 Swagger UI 中传递参数?
问题描述
我需要做一个 api 来制作某种逻辑(例如:处理一些数据,生成 wordcloud,制作一个 ml 层......)并返回一个简单的状态。在我想做的逻辑中,我不需要模型,只需接收带有一些参数的 json 并做我想做的事情。
我刚刚创建了 api 视图,但是我找不到在正文中接收参数的方法。
我正在阅读一个很好的模式来设计我的方法(Django Rest Framework 业务逻辑,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)
网址.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 是空的。即使在招摇的 UI 中,我也看不到参数标签来发送我的 json。
我发现的所有示例都使用模型和序列化程序。
一个简单的 Api View 接收一个并返回一个“Hello”+ Name,对我来说就足够了。
如何在 WordCloudViewSet 中指定,通过 post 请求输入参数,而不使用模型?
感谢您的关注,并提前感谢您的回复。
编辑
令人惊讶的是,我没有尝试过request.data
并且它有效。但是,在 swagger UI 中,当我评论 previosluy 时,我无法测试我的 api,因为它没有显示输入标签来发送请求。
解决方案
最后,我找到了一个简单的解决方案,我只需要更改网址,从此:
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)
我希望这对其他人有用。
推荐阅读
- javascript - Strapi 从 3.0.x alpha 升级到 beta
- c - C编程循环奇怪的行为
- powerbi - 在 DAX 中,如何从 DAX 表变量(通过 ADDCOLUMN 创建)返回计算列的总和?
- php - 通过 PHP 执行。我无法将输出(stderr)放入文件中
- symfony - 自定义存储库上带有 ApiPlatform 的分页器
- bazel - bazel 宏存在哪些运行时调试/自省技术?
- reactjs - useEffect 作为具有多个依赖项的 componentDidUpdate
- bash - Maven 脚本显示 Java 命令不可执行
- javascript - 如何在 thymeleaf 的每个循环中获取字符串值并将其应用于带有 javascript/jquery 的模态中的日期字段?
- mysql - MySQL 3 分钟后发送消息