我正在使用 django、django drf 和 drf-yasg 来生成编写我的 BE 并生成文档。
我有一个名为 User 的模型和一个用于用户的序列化程序:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = users_models.User
fields = (users_models.User.first_name.field_name,
users_models.User.last_name.field_name,)
Run Code Online (Sandbox Code Playgroud)
我有一些方法 Foo 可以获得两个用户。这是请求的序列化程序的样子:
class FooRequestSerializer(serializers.ModelSerializer):
first_user = UserSerializer(help_text="first user")
second_user = UserSerializer(help_text="second user")
Run Code Online (Sandbox Code Playgroud)
当我为此生成一个swagger json方案时,我查看了json和redoc,我看到了:
我注意到如果我确保 ref 名称是不同的,那么 redoc 读起来很好,因为 first_user 和 second_user 得到了他们自己的描述。问题来了,因为我也希望以后能够使用 swagger codegen 来创建 Java 存根,所以解决方案和据我所知,每个不同的 ref 名称都有一个不同的类。理想情况下,我会看到对 foo 的调用类似于
Foo(User first_user, User second_user)
Run Code Online (Sandbox Code Playgroud)
这让我想到了一个问题:
如果 first_user 和 …
我正在尝试从swagger(使用drf-yasg)进行上传文件输入,但是当我使用MultiPartParser类时,它给了我以下错误:
drf_yasg.errors.SwaggerGenerationError: FileField is supported only in a formData Parameter or response Schema
Run Code Online (Sandbox Code Playgroud)
我的看法:
drf_yasg.errors.SwaggerGenerationError: FileField is supported only in a formData Parameter or response Schema
Run Code Online (Sandbox Code Playgroud)
我的序列化器:
class AddExperience(generics.CreateAPIView):
parser_classes = [MultiPartParser]
permission_classes = [IsAuthenticated]
serializer_class = DoctorExperienceSerializer
Run Code Online (Sandbox Code Playgroud)
我也尝试过FormParser,但它仍然给我同样的错误。另外:FileUploadParser解析器但它的工作原理如下JsonParser:
该项目使用了招摇。有以下代码。
@swagger_auto_schema(
manual_parameters=[
Parameter('download', IN_QUERY,
'Set `Content-Disposition=attachment` to make browser to download file'
'instead of showing it.',
type='bool'),
Parameter('share_id', IN_PATH, type='uuid')
],
security=[],
responses={'400': 'Validation Error (e.g. base64 is wrong)',
'200': VideoSerializer}
)
Run Code Online (Sandbox Code Playgroud)
请解释每个论点的责任。我阅读了文档,但了解的很少......特别感兴趣'200': VideoSerializer
在我的应用程序中,我需要有多个 Swagger 页面,其中包含多个客户端的分组端点。
我的一个客户端(路径)提供移动应用程序 API,另一个提供 Web 客户端 API。URL 模式相应地保持在 2 种不同中urls.py。
我正在使用drf-yasg为我的 API 生成模式。
为了生成swagger规范,我schema_views为每个urls.py文件分别初始化 2 个,如下所示:
from api_mobile.urls import urlpatterns as mobile_patterns
from api_web.urls import urlpatterns as web_patterns
mobile_schema_view = get_schema_view(
openapi.Info(
title="Mobile API",
default_version='v3',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=mobile_patterns,
)
web_schema_view = get_schema_view(
openapi.Info(
title="Web API",
default_version='v1',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=web_patterns,
)
urlpatterns = [
path(
'api/mobile/docs',
mobile_schema_view.with_ui('swagger', cache_timeout=0),
name='mobile-schema-ui'
),
path(
'api/web/docs',
web_schema_view.with_ui('swagger', cache_timeout=0),
name='web-schema-ui'
),
path('api/mobile/v3/', include('api_mobile.urls'), …Run Code Online (Sandbox Code Playgroud) 我正在我的项目中使用drf-yasg为 django rest 框架 API实现 swagger 。
我遵循 drf-yasg 的快速入门部分。当我点击 /swagger 时,得到 AssertionError:发现重复参数。下面是我的代码和回溯。
网址.py
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
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 = [
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'),
# path('graphql', csrf_exempt(GraphQLObservableUnboxingView.as_view(graphiql=True, schema=schema))),
]
Run Code Online (Sandbox Code Playgroud)
追溯
```Traceback (most recent call last):
File "/home/abc/development/sw_api/env_sw_api_python3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/abc/development/sw_api/env_sw_api_python3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in …Run Code Online (Sandbox Code Playgroud) 我正在将我的 Django 1.11.7 迁移到 2.x。问题之一是 django-rest-swagger,它现在已被弃用。drf-yasg 现在应该是 API 文档和创建的方式。我需要以类似的方式创建自定义 api,这样它就不会破坏移动设备中的任何内容。
以前是这样的(django-rest-swagger==2.1.1)
这是在 Django 1.11.7 和 django-rest-swagger==2.1.1 中运行良好的旧代码片段:
using swagger_schema.py
https://gist.github.com/axilaris/2f72fef8f30c56d5befe9e31cd76eb50
in url.py:
from rest_framework_swagger.views import get_swagger_view
from myapp.swagger_schema import SwaggerSchemaView
urlpatterns = [
url(r'^swaggerdoc/', SwaggerSchemaView.as_view()),
url(r'^api/v1/general/get_countries$', api.get_countries, name='get_countries'),
in api.py:
@api_view(['POST'])
def get_countries(request):
# ----- YAML below for Swagger -----
"""
description: countries list
parameters:
- name: token
type: string
required: true
location: form
"""
......
return Response(countries_list, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在 drf-yasg 中进行类似的操作,因为我想迁移此代码并且不要破坏移动设备上的任何内容。
可能尝试在最新的稳定版本上执行此操作:
djangorestframework==3.9
drf-yasg==1.16.1
Run Code Online (Sandbox Code Playgroud) 我使用drf-yasg库为开发人员前端生成项目文档。我不知道如何将数据添加到参数和响应字段
例如,这个类
class VendorsCreateView(APIView):
"""
:param:
data = {
"vendor_name": "TestName",
"country": "Belarus",
"nda": "2020-12-12",
"parent": "",
"contacts": [{"contact_name": "Mrk", "phone": "2373823", "email": "dRqT@rgmail.com"},
{"contact_name": "Uio", "phone": "34567", "email": "rdq@gmail.com"}
]
}
:return: swagger name
"""
Run Code Online (Sandbox Code Playgroud)
如何添加这些参数?
如何禁用 drf_yasg 中的授权按钮?(我仍然希望 CSRF 起作用)
更新:目前,我有这样的设置,因为我想删除 Django 登录并维护 csrf。但是,授权按钮仍然存在(如何删除授权按钮并维护csrf)
SWAGGER_SETTINGS = {
'USE_SESSION_AUTH': False,
'SECURITY_DEFINITIONS': {
'Basic': {
'type': 'basic'
},
},
}
Run Code Online (Sandbox Code Playgroud) 我使用Django、DRF、drf-yasg和Swagger Codegen自动构建 TypeScript 代码来访问我的 REST API。
在 Django 后端中,我添加了一条与 DRF 一起提供服务的路径:
rest_router = routers.DefaultRouter()
rest_router.register(r'source/(?P<source_id>[0-9]+)/document', DocumentViewSet)
Run Code Online (Sandbox Code Playgroud)
DocumentViewSet是一个 DRF ModelViewSet。
可以看到,source_id参数是数字类型。但是,生成的 API 描述将source_id参数定义为 String 类型。
显然路径设置中的数字正则表达式是不够的,所以我想我需要在类中使用一些类型注释DocumentViewSet?我尝试了以下代码,但这没有效果:
@swagger_auto_schema(
manual_parameters=[
openapi.Parameter(name="source_id",
required=True,
type="integer",
in_="path",
description="Source reference",
),
],
)
class DocumentViewSet(viewsets.ModelViewSet):
serializer_class = rest_serializers.DocumentSerializer
queryset = models.Document.objects.all().order_by('id')
Run Code Online (Sandbox Code Playgroud)
如何告诉 drf-yasg 将source_id参数设置为 Integer 类型?
我使用drf-yasg 包为我的 DRF API设置了 openapi ,但由于某种原因,我的文档中 POST 或 PUT 的所有端点都没有显示所需的必要字段。我如何设置它以显示将数据发送到 API 所需的必要字段,目前它们没有显示在架构中以及为 API 生成的文档中
这是我的代码
#项目级别的urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from rest_framework import permissions # new
from drf_yasg.views import get_schema_view # new
from drf_yasg import openapi # new
schema_view = get_schema_view( # new
openapi.Info(
title="Blog API",
default_version="v1",
description="API for CaseMed Insurance",
terms_of_service="https://www.google.com/policies/terms/",
contact=openapi.Contact(email="hello@example.com"),
license=openapi.License(name="BSD License"),
),
public=True,
permission_classes=(permissions.AllowAny,),
)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/auth/', include('user.urls')), …Run Code Online (Sandbox Code Playgroud)