之前在Django 1.11中,我是这样定义Django REST API的:
在url.py中:
url(r'^api/test_token$', api.test_token, name='test_token'),
in api.py
@api_view(['POST'])
def test_token(request):
# ----- YAML below for Swagger -----
"""
description: test_token
parameters:
- name: token
type: string
required: true
location: form
"""
token = request.POST['token']
return Response("test_token success", status=status.HTTP_200_OK)
现在我正在迁移到Django 3.1.5,我想知道如何使用Django Rest Framework(DRF)以相同的方式实现上述内容。在上述特定情况下,是POST API“test_token”接受一个参数。并生成API文档,如swagger/redoc(可用于测试API)。
一些注释:
- 需要注意的是,django-rest-swagger在2019年6月被弃用了 django-rest-swagger UI没有用于POST请求体(基于函数的视图)的表单
- 需要注意的是,它使用request.POST(表单数据)作为参数 https://www.django-rest-framework.org/tutorial/2-requests-and-responses/
- 在Django 1.11.x中,我使用了这个swagger_schema.py - https://gist.github.com/axilaris/b7152215a76f6f1f5ffca0436991328d
如何在Django 3.x上实现这个?(就像标题中写的:Django Rest Framework自定义POST URL端点并使用Swagger或其他文档)
更新:
我认为这里有一些解决方案:https://github.com/tfranzel/drf-spectacular/issues/279
由于我有很多使用@api_view的API,将docstring更改为装饰器@extend_schema可能是最简单的迁移路径。我希望有人能提供关于url.py的指导,以便使用@extend_schema进行转换。这是为了获得url端点和swagger的实现。谢谢。
这是我使用drf-spectacular最接近的结果。
@extend_schema(
parameters=[OpenApiParameter(
name='token',
type={'type': 'string'},
location=OpenApiParameter.QUERY,
required=False,
style='form',
explode=False,
)],
responses=OpenApiTypes.OBJECT,
)
@api_view(['POST'])
def test_api(request):
# ----- YAML below for Swagger -----
"""
description: test_api
parameters:
- name: token
type: string
required: true
location: form
"""
token = request.POST['token']
return Response("success test_api:" + token, status=status.HTTP_200_OK)
它给出了这个结果(是错误的),注意令牌查询
curl -X POST "http://localhost:8000/api/test_token/?token=hello" -H "accept: application/json" -H "X-CSRFToken: JyPOSAQx04LK0aM8IUgUmkruALSNwRbeYDzUHBhCjtXafC3tnHRFsxvyg5SgMLhI" -d ""
使用{{POST输入参数}}的替代方法(如何获取?)
curl -X POST --header 'Content-Type: application/x-www-form-urlencoded' --header 'Accept: application/json' --header 'X-CSRFToken: aExHCSwrRyStDiOhkk8Mztfth2sqonhTkUFaJbnXSFKXCynqzDQEzcRCAufYv6MC' -d 'token=hello' 'http://localhost:8000/api/test_token/
解决方案:
url.py
from drf_yasg.utils import swagger_auto_schema
from rest_framework.response import Response
from rest_framework import status
from rest_framework.decorators import parser_classes
from rest_framework.parsers import FormParser
token = openapi.Parameter('token', openapi.IN_FORM, type=openapi.TYPE_STRING, required=True)
something = openapi.Parameter('something', openapi.IN_FORM, type=openapi.TYPE_INTEGER, required=False)
@swagger_auto_schema(
method="post",
manual_parameters=[token, something],
operation_id="token_api"
)
@api_view(['POST'])
# this is optional and insures that the view gets formdata
@parser_classes([FormParser])
def token_api(request):
token = request.POST['token']
something = request.POST['something']
return Response("success test_api:" + token + something, status=status.HTTP_200_OK)
schema_view = get_schema_view(
openapi.Info(
title="Snippets API",
default_version='v1',
description="Test description",
terms_of_service="https://www.google.com/policies/terms/",
contact=openapi.Contact(email="contact@snippets.local"),
license=openapi.License(name="BSD License"),
),
public=True,
permission_classes=[permissions.AllowAny],
)
urlpatterns = [
path('token_api', token_api, name='token_api'),
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
] + required_urlpatterns