Django REST框架Swagger 2.0

Django REST框架Swagger 2.0,django,django-rest-framework,swagger-ui,swagger-2.0,openapi,Django,Django Rest Framework,Swagger Ui,Swagger 2.0,Openapi,很难配置大摇大摆的用户界面 以下是非常有说明性的文件: YAML文档字符串已弃用。有人知道如何在python代码中配置Swagger UI吗?或者,我应该将哪个文件更改为组api端点、向每个端点添加注释、在Swagger UI中添加查询参数字段?我就是这样做的: 基本URL.py urlpatterns = [ ... url(r'^api/', include('api.urls', namespace='api')), url(r'^api-auth/', include('rest_fra

很难配置大摇大摆的用户界面 以下是非常有说明性的文件:


YAML文档字符串已弃用。有人知道如何在python代码中配置Swagger UI吗?或者,我应该将哪个文件更改为组api端点、向每个端点添加注释、在Swagger UI中添加查询参数字段?

我就是这样做的:

基本URL.py

urlpatterns = [
...
url(r'^api/', include('api.urls', namespace='api')),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
...
]
api.url.py

urlpatterns = [
url(r'^$', schema_view, name='swagger'),
url(r'^article/(?P<pk>[0-9]+)/$', 
    ArticleDetailApiView.as_view(actions={'get': 'get_article_by_id'}), 
    name='article_detail_id'),
url(r'^article/(?P<name>.+)/(?P<pk>[0-9]+)/$', 
    ArticleDetailApiView.as_view(actions={'get': 'get_article'}), 
    name='article_detail'),
]
django rest swagger(2.0.7)的更新:将仅添加自定义项替换为获取自定义项

views.py

class MyOpenAPIRenderer(OpenAPIRenderer):
    def get_customizations(self):
        data = super(MyOpenAPIRenderer, self).get_customizations()
        data['paths'] = custom_data['paths']
        data['info'] = custom_data['info']
        data['basePath'] = custom_data['basePath']
        return data

您可以通过读取来创建自定义数据。

因此,似乎发生的是django rest Framework,但它还不成熟,并且缺少从代码文档生成操作描述的功能,并且在3.5.0中到期

与此同时,django rest swagger继续更新他们的代码,以便与新的SchemaGenerator一起工作,这使它暂时成为一个好工具


非常奇怪的一系列事件导致了这一点):希望这一问题能很快得到解决。目前,建议的答案是唯一的选择。

编辑-因为swagger 2.2.0版和rest framework 3.9.2创建了如下自定义模式:

from rest_framework.schemas import AutoSchema


class CustomSchema(AutoSchema):
    def get_link(self, path, method, base_url):
        link = super().get_link(path, method, base_url)
        link._fields += self.get_core_fields()
        return link

    def get_core_fields(self):
        return getattr(self.view, 'coreapi_fields', ())
from rest_framework.schemas import SchemaGenerator


class MySchemaGenerator(SchemaGenerator):   
    title = 'REST API Index'

    def get_link(self, path, method, view):
        link = super(MySchemaGenerator, self).get_link(path, method, view)
        link._fields += self.get_core_fields(view)
        return link

    def get_core_fields(self, view):
        return getattr(view, 'coreapi_fields', ())
然后,只需使用
DEFAULT\u SCHEMA\u类
设置

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'common.schema.CustomSchema',
}

!以下方法已过时。

由于找不到任何可行的选项,我只创建了自己的SchemaGenerator,如下所示:

from rest_framework.schemas import AutoSchema


class CustomSchema(AutoSchema):
    def get_link(self, path, method, base_url):
        link = super().get_link(path, method, base_url)
        link._fields += self.get_core_fields()
        return link

    def get_core_fields(self):
        return getattr(self.view, 'coreapi_fields', ())
from rest_framework.schemas import SchemaGenerator


class MySchemaGenerator(SchemaGenerator):   
    title = 'REST API Index'

    def get_link(self, path, method, view):
        link = super(MySchemaGenerator, self).get_link(path, method, view)
        link._fields += self.get_core_fields(view)
        return link

    def get_core_fields(self, view):
        return getattr(view, 'coreapi_fields', ())
创建了大摇大摆的视图:

from rest_framework.permissions import AllowAny
from rest_framework.renderers import CoreJSONRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_swagger import renderers


class SwaggerSchemaView(APIView):
    _ignore_model_permissions = True
    exclude_from_schema = True
    permission_classes = [AllowAny]
    renderer_classes = [
        CoreJSONRenderer,
        renderers.OpenAPIRenderer,
        renderers.SwaggerUIRenderer
    ]

    def get(self, request):
        generator = MySchemaGenerator()
        schema = generator.get_schema(request=request)

        return Response(schema)
在URL.py中使用此视图:

url(r'^docs/$', SwaggerSchemaView.as_view()),
在APIView中添加自定义字段:

class EmailValidator(APIView):
    coreapi_fields = (
        coreapi.Field(
            name='email',
            location='query',
            required=True,
            description='Email Address to be validated',
            type='string'
        ),
    )

    def get(self, request):
        return Response('something')

使用建议的解决方案有点粗糙,但效果很好,在实施建议的解决方案时可能会遇到一些问题,但本文档解释了django rest swagger 2集成以及逐步面临的问题:


虽然已经很晚了,但现在可能对寻求帮助的人有所帮助。

您是否有想要进行分组的示例,例如在另一个基于招摇过市的API上?在分组方面,招摇过市可能会有很大的局限性——为此我编写了定制模板。我想象的注释是从端点方法上的docstring添加的。如果查询参数定义正确,则应该显示这些参数……尽管我模糊地记得有些情况下它们没有出现。您到底在哪里找到了
add\u customizations
?我在源代码中根本找不到它。因此,此解决方案对我不起作用。不确定此修补程序与哪个版本相关,但django rest swagger==2.1.0不包含
add_customizations
或任何类似的命名函数,其中包含上一个示例中描述的“data”变量,它是
custom_data
用户定义的吗?是,您可以查看swagger规范来创建它,如答案中所述。