使用 drf-yasg,如何提供模式?

jup*_*iar 7 django swagger django-rest-framework

我已经安装了 drf-yasg,它运行良好。我遇到的问题是它是一个很大的应用程序,并且对于每种类型的前端客户端都有大量的端点,即/admin/v1, /app/v1, ...

所以我认为将每种类型的文档分开是个好主意,即

urlpatterns += [
     url(r'^/admin/swagger/$', admin_schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
     url(r'^/app/swagger/$', app_schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
]
Run Code Online (Sandbox Code Playgroud)

所以看起来 drf-yasg 支持这一点,通过提供patternsget_scheme_view

admin_schema_view = get_schema_view(
    openapi.Info(
        title="API",
        default_version='v1',
        description="The set of API endpoints used.",
        terms_of_service="https://www.google.com/policies/terms/",
        contact=openapi.Contact(email="contact@me"),
        license=openapi.License(name="BSD License"),
    ),
    patterns=?????,
    validators=['flex', 'ssv'],
    public=True,
    permission_classes=(permissions.AllowAny,),
)
Run Code Online (Sandbox Code Playgroud)

现在我的猜测是提供一个字符串,与定义时的第一个字符串相同urls,例如patterns=r'^admin/v1/',导致:

File "/usr/local/lib/python3.6/dist- packages/rest_framework/compat.py", line 55, in get_original_route
return urlpattern.regex.pattern
AttributeError: 'str' object has no attribute 'regex'
Run Code Online (Sandbox Code Playgroud)

因此,使用drf-yasg docs 中的文档

模式 - 如果给定,则只会枚举这些模式以包含在 API 规范中

这里究竟需要什么类型的对象才能进行处理patterns?我尝试在github上查看django-rest-framework和Django源代码,但找不到实际需要的类型,它们都是非常大的项目。

Ken*_*ars 6

经过一些实验,我发现它期望的模式是一个 url 模式列表,而不仅仅是一个标准的 Python 正则表达式字符串。它应该正好是同一标准的Djangourlpatternsurls.py

因此,假设您已将管理 API url 模式导入为admin_urlpatterns,您需要的只是在 patterns 选项中指定它

admin_schema_view = get_schema_view(
openapi.Info(
    title="API",
    default_version='v1',
    description="The set of API endpoints used.",
    terms_of_service="https://www.google.com/policies/terms/",
    contact=openapi.Contact(email="contact@me"),
    license=openapi.License(name="BSD License"),
),
patterns=admin_urlpatterns,
validators=['flex', 'ssv'],
public=True,
permission_classes=(permissions.AllowAny,),
)
Run Code Online (Sandbox Code Playgroud)

绝对很难找到任何示例,他们可能希望在文档中包含一个生动的示例