Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework drf_yasg和amazonapi网关返回json而不是html用户界面_Django Rest Framework_Swagger_Drf Yasg_Amazon Api Gateway - Fatal编程技术网

Django rest framework drf_yasg和amazonapi网关返回json而不是html用户界面

Django rest framework drf_yasg和amazonapi网关返回json而不是html用户界面,django-rest-framework,swagger,drf-yasg,amazon-api-gateway,Django Rest Framework,Swagger,Drf Yasg,Amazon Api Gateway,我已经使用djangorestframework设置了python api服务,我正在使用drf_yasg为我的api显示招摇过市的文档 以下是设置一览表: schema_view = get_schema_view( openapi.Info( title='My API', default_version='v1', description='rest service', terms_of_service='', contac

我已经使用djangorestframework设置了python api服务,我正在使用drf_yasg为我的api显示招摇过市的文档

以下是设置一览表:

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'),
]

schema\u view=get\u schema\u view(
openapi.Info(
title='My API',
默认版本='v1',
description='rest服务',
服务条款=“”,
contact=openapi.contact(email=)my@email'),
license=openapi.license(name='BSD license'),
),
public=False,
)
URL模式=[
路径('pyapi/weather/',包括('apps.weather.url'),
re_path(r'^pyapi/swagger(?P\.json |\.yaml)$),schema_view。没有ui(cache_timeout=0),name='schema-json'),
re_路径(r'^pyapi/swagger/$,架构视图。带有_ui('swagger',cache_timeout=0),name='schema-swagger-ui'),
re_路径(r'^pyapi/redoc/$',架构视图。带有ui('redoc',cache\u timeout=0),name='schema-redoc'),
]
接下来,我用AmazonEC2和其他东西设置这个api,并使用AmazonAPI网关从容器访问api

现在的问题是,当我尝试使用api网关域访问它时,它返回的是swagger JSON,而不是HTML。 我尝试了几种方法,比如在方法响应和集成响应中设置
内容类型
映射,但都不起作用

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

如果有人能帮忙,我将不胜感激

好吧,我解开了谜团! 经过大量的尝试和到处查看,我发现API网关请求头设置中存在问题

实际上yasg博士也有点奇怪让我告诉你为什么。 如我在第一幅图中所示设置URL后,如果您尝试访问
http://localhost:8000/pyapi/swagger/
它完美地显示了用户界面。 此时请求头的值为
Accept:text/html、application/xhtml+xml、application/xml;q=0.9,图像/webp,图像/apng,*/*;q=0.8,申请/签名交换;v=b3;q=0.9

现在,如果您传递请求头
“Accept:application/json”
,那么在显示html UI的同时,它显示的是招摇过市的json!沃特

我在AmazonAPI网关的测试方法的输出中发现。默认情况下,它发送的是
“Accept:application/json”
,这就是为什么我总是在输出中得到swagger.json。那真是太棒了! 我把它改为
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,图像/webp,图像/apng,*/*;q=0.8,申请/签名交换;v=b3;q=0.9
现在我可以完美地看到UI了


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

哈宁没有使用YASG,所以只是一些一般性的问题。所需的尾随“/”是否以某种方式抛出它,我在api网关中没有看到?也许可以在settings.py中使用DEBUG=False在本地进行尝试,看看是否会发生同样的情况?您可以使用
httpie
从localhost:8000手动请求它,并尝试通过添加/删除头来复制它,可能api网关正在过滤某些内容。谢谢!我尝试使用Debug=False在本地运行,但它仍然可以正常工作!实际上,即使是从aws负载平衡器,如果我尝试访问,它也可以正常工作。只有当它通过API网关时,它才会突然改变对json的响应。我不明白那个秘密!解决得很好。我没有意识到你使用的是网关的测试功能,对不起。我假设在prod模式下,它可能会基本上禁用html UI。