drf_yasg挥舞中的base_url问题

问题描述

我正在Nstrongx的 8000 端口上运行Django。 Nginx在这里暴露在8000端口的外部。但是在Swagger UI中, base_url 设置为不带端口。因此Swagger尝试访问没有端口的端点,然后给出 TypeError:无法提取的响应。

请参考下图,了解如何设置base_url

enter image description here

请参阅下图,以了解如何从Swagger发送请求

enter image description here

当我使用Postman访问端点(带有端口)时,它工作正常。仅当我尝试使用Swagger时才会出现此问题(因为发送的请求没有端口)。

在这里,我希望Swagger使用端口发送所有请求。请帮助我解决此问题。谢谢。

注意:

  1. 我正在使用 drf-yasg == 1.17.1 包来生成 Swagger UI
  2. 其他要求是 Django == 3.0.3 djangorestframework == 3.11.0

解决方法

这不是一个好的解决方案,但是可以在urls.py的url中定义完整的get_schema_view()

schema_view = get_schema_view(
    openapi.Info( ... ),url='http://example.net:8080/',# Important bit
    public=True,permission_classes=(permissions.AllowAny,)
)

Source

,

您还需要告诉Nginx转发服务器端口。当swager从请求标头获取基本url端口时(如果未按照建议的mtshaikh进行硬编码)。

例如像这样的东西应该在Nginx配置中

location / {
            proxy_set_header Host $host:$server_port;
    proxy_pass http://example.com:8000/;
}
,

谢谢@Petr Synek的回答和线索。

我们需要告诉Nginx转发 http_host

location / {
     proxy_set_header Host $http_host;
}

这解决了上述问题