python - 如何使用 Django Rest Framework 生成 ping-pong api?
问题描述
我想使用 Django Rest Framework 构建一个简单的 Ping-Pong,所以我不需要 Model。我通过 swagger(drf_yasg) 观察 api 的状态,但我找不到它的任何参数。
我想为路由创建序列化器、视图和一些代码。我从终端收到了一些错误行。
串行器
from rest_framework import serializers
class PingPongSerializer(serializers.Serializer):
ping = serializers.CharField(allow_blank=True,
default="ping",
max_length=20,
help_text="please input 'ping'")
# example_ping = PingPongSerializer({"ping": "hoge"})
# => {'ping' : 'hoge'}
# example_ping = PingPongSerializer({})
# print(example_ping.data)
# => {'ping' : 'hoge'}
看法
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from ping_pong.serializers import PingPongSerializer
# Create your views here.
class PingPongView(APIView):
def get(self, request, format=None):
serializer = PingPongSerializer(data=request)
print(request)
if serializer.is_valid():
print(request.data)
return Response(serializer.data)
else:
print(serializer)
print(serializer.errors)
return Response({'result': "I don't know anything"})
网址
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from rest_framework import routers
from ping_pong import views
from django.conf.urls import include
# router = routers.SimpleRouter()
# router.register(r'ping', views.PingPongView, base_name='ping')
schema_view = get_schema_view(
openapi.Info(
title="Restful API Lists",
default_version='v1',
description="Ping Pong",
license=openapi.License(name="MIT"),
),
public=True,
permission_classes=(permissions.AllowAny,),
)
urlpatterns = [
path('admin/', admin.site.urls),
# url(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
url(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
url(r'ping', views.PingPongView.as_view(), name='ping'),
]
结果
卷曲
curl -X GET "http://localhost:8000/ping" -H "accept: application/json" -H "X-CSRFToken: ..."
结果
{
"result": "I don't know anything"
}
错误日志
<rest_framework.request.Request object at 0x7f2ed029d850>
PingPongSerializer(data=<rest_framework.request.Request object>):
ping = CharField(allow_blank=True, default='ping', help_text="please input 'ping'", max_length=20)
{'non_field_errors': [ErrorDetail(string='Invalid data. Expected a dictionary, but got Request.', code='i
nvalid')]}
解决方案
感谢建议,我能够找到答案。
最终代码如下所示:
串行器
from rest_framework import serializers
class PingPongSerializer(serializers.Serializer):
ping = serializers.CharField(allow_blank=True,
default="ping",
max_length=10,
help_text="please input 'ping'")
看法
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from ping_pong.serializers import PingPongSerializer
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
# Create your views here.
class PingPongView(APIView):
@swagger_auto_schema(manual_parameters=[
openapi.Parameter('ping',
openapi.IN_QUERY,
description="please input ping",
type=openapi.TYPE_STRING)
])
def get(self, request, format=None):
serializer = PingPongSerializer(data=request.GET)
if serializer.is_valid():
if serializer.data['ping'] == 'ping':
return Response({'result': 'pong'})
else:
return Response({'result': "What's in your head?"})
else:
return Response({'error': serializer.errors})
网址
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from rest_framework import routers
from ping_pong import views
from django.conf.urls import include
router = routers.SimpleRouter()
router.register(r'ping', views.PingPongView, base_name='ping')
schema_view = get_schema_view(
openapi.Info(
title="Restful API Lists",
default_version='v1',
description="Ping Pong Api",
license=openapi.License(name="MIT"),
),
public=True,
permission_classes=(permissions.AllowAny,),
)
urlpatterns = [
path('admin/', admin.site.urls),
# url(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
url(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
url(r'ping', views.PingPongView.as_view(), name='ping'),
]
结果
参数:“ppng”
回应:{“结果”:“你脑子里想的是什么?” }
推荐阅读
- java - 如何在正确项目的多项目中加载资源路径?
- python - 查找两个不同模型的两个查询集的交集
- python - 替换字符串中的子字符串:Python
- microservices - 如何使用 traefik 为服务器 api 添加 url 前缀?
- javascript - 使用 Ajax 在 Div 单击时更新 MYSQL 表 - 没有页面刷新?
- postgresql - 在 typeORM Typescript 的 WHERE 条件中使用 LIKE
- c# - 使用 Entity Framework Core 映射图像类型属性
- javascript - 为什么我在 Javascript 中查找从 2 到给定数字的素数的代码无法正常工作
- r - 根据条件将列添加到数据框
- python - 如何将图像添加到轴中的条形图(matplotlib)