1
votes

problèmes de base_url dans drf_yasg swagger

J'utilise Django avec Nginx sur le port 8000 . Ici Nginx est exposé à l'extérieur dans le port 8000. Mais dans Swagger UI, base_url est défini comme sans port. Swagger essaie donc d'accéder aux points de terminaison sans port, puis il donne une réponse comme TypeError: Failed to fetch .

Veuillez vous référer à l'image ci-dessous pour savoir comment base_url est définie entrez la description de l'image ici

Veuillez vous référer à l'image ci-dessous pour savoir comment une demande est envoyée par Swagger entrez la description de l'image ici

Lorsque j'accède au point de terminaison (avec port) en utilisant Postman, cela fonctionne bien. Le problème se produit uniquement lorsque j'essaie d'utiliser Swagger (car une demande est envoyée sans port).

Ici, je veux que Swagger envoie toutes les demandes avec le port. Veuillez m'aider à résoudre ce problème. Merci.

Remarque:

  1. J'utilise le package drf-yasg == 1.17.1 pour générer l' interface utilisateur Swagger
  2. Les autres exigences sont Django == 3.0.3 et djangorestframework == 3.11.0

0 commentaires

3 Réponses :


0
votes

Ce n'est pas une bonne solution, mais définir l' url complète dans get_schema_view() dans urls.py fonctionne!

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

La source


2 commentaires

Merci pour votre réponse, @mtshaikh. Cela fonctionne bien, mais y a-t-il un moyen de le faire de manière automatique?


AFAIK, il y a un problème / discussion ouvert sur cette fonctionnalité actuellement en cours sur le github drf_yasg .



0
votes

Vous devez également indiquer au Nginx de transférer le port du serveur. As swager obtient le port url de base de l'en-tête de la requête (s'il n'est pas codé en dur comme le propose mtshaikh).

par exemple. quelque chose comme ça devrait être dans la configuration Nginx

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


1 commentaires

Merci pour votre réponse et votre indice. J'ai trouvé la bonne solution et ajouté un commentaire.



0
votes

Merci, @Petr Synek pour vos réponses et vos indices.

Nous devons dire au Nginx de transmettre le http_host .

location / {
     proxy_set_header Host $http_host;
}

Celui-ci a résolu le problème mentionné ci-dessus


0 commentaires