首页 > 解决方案 > 如何使用 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')]}                                

标签: pythondjangodjango-rest-framework

解决方案


感谢建议,我能够找到答案。

最终代码如下所示:

串行器

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”

回应:{“结果”:“你脑子里想的是什么?” }


推荐阅读