1

我已经使用 djangorestframework 设置了我的 python api 服务,并且我正在使用 drf_yasg 为我的 api 显示 swagger 文档。

这是设置的概览:

schema_view = get_schema_view(
   openapi.Info(
      title='My API',
      default_version='v1',
      description='rest service',
      terms_of_service='',
      contact=openapi.Contact(email='my@email'),
      license=openapi.License(name='BSD License'),
   ),
   public=False,
)

urlpatterns = [
    path('pyapi/weather/', include('apps.weather.urls')),


    re_path(r'^pyapi/swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
    re_path(r'^pyapi/swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    re_path(r'^pyapi/redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]

接下来,我使用 amazon ec2 和其他东西设置了这个 api,并且我正在使用 Amazon API Gateway 从容器中访问 api。

API 网关设置

现在的问题是,当我尝试使用 api 网关域访问它时,它返回的是swagger JSON而不是 HTML。我尝试了几种方法,例如Content-Type在方法响应和集成响应中设置映射,但没有任何效果。

在我的本地机器上,它按预期显示 html,所以我怀疑问题出在我的网关设置中。

如果有人可以提供帮助,我将不胜感激!

4

1 回答 1

1

好的,我解开了谜团!经过大量尝试并四处寻找,我发现 API Gateway请求标头设置存在问题。

实际上 drf-yasg 也有点奇怪,让我告诉你为什么。如第一张图片所示设置 url 后,如果您尝试访问http://localhost:8000/pyapi/swagger/它会完美显示 UI。那时请求标头的值为Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

现在,如果您传递请求标头"Accept: application/json",则相同的 URL 不是显示 html UI,而是显示 swagger JSON!呜!!

我在 Amazon API Gateways 的测试方法的输出中发现的。它是默认发送的"Accept: application/json",这就是为什么我总是在输出中得到 swagger.json。那是最引人注目的事情!我将其更改为Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9,现在我可以完美地看到 UI!

我希望这将节省许多像我这样对这种东西不熟悉的人的时间!

于 2020-07-04T11:06:47.530 回答