Comment puis-je envoyer une requête GET à partir de mon flacon d'application vers un autre site?
À l'origine, j'ai essayé de poster une requête ajax de mon côté client à un tiers url, mais il semble que le navigateur ont des problèmes de sécurité avec que. J'ai pensé à envoyer une requête ajax pour le côté serveur, à partir de là à envoyer une requête GET à la troisième partie, d'obtenir la réponse et l'envoyer vers le côté client. Comment puis-je faire avec flacon?
Vous devez vous connecter pour publier un commentaire.
Installer le
requests
module (beaucoup plus agréable que d'utiliserurllib2
) et puis de définir une route qui en fait le nécessaire, demandez - quelque chose comme:En fonction de votre installation, mais cependant, il serait préférable de configurer votre serveur de proxy inverse pour le site cible sous certaines URL.
requests.get('http://example.com')
obtenez-vous le même? (juste pour vérifier il n'y a pas de filtrage basée sur l'Utilisateur de l'Agent ou de quelque chose)requests.get("http://www.google.com")
. Je n'arrive pas à trouver une solution de contournement. @Jon Clementsreturn Response(
requests.get('http://example.com').content,
mimetype='application/json')
requests.get(...)
comme si c'était une demande faite par le client dans le Flacon d'application (qui pourrait avoir causé les appels récursifs à mon@app.route
s), mais ... :/ configurer quelques tests pour ne pas me conduire n'importe oùrequests.get("localhost:5000/myroute")
mais ce n'est pas de produire un appel récursif de la route. Il semble querequests.get(...)
et autres extractions sont tout simplement pas de travail.Flacon, seul, n'a pas cette capacité, mais c'est une simple question d'écrire un gestionnaire de requêtes qui fait une demande à un autre serveur à l'aide d'un client HTTP bibliothèque, puis retourner la réponse.
Toutefois, cela ne permettra pas d'obtenir exactement le même résultat que vous pourriez attendre d'un client-côté de la demande. Depuis votre serveur ne peut pas "voir" tous les témoins que le navigateur du client a enregistré pour le site cible, votre proxy demande sera effectivement anonyme et donc, en fonction de l'emplacement de la cible, peut échouer ou de vous donner une autre réponse que vous obtiendrez demandant des ressources dans le navigateur.
Si vous avez une relation avec la troisième partie de l'URL (qui est, si vous le contrôlez, ou sont en mesure de travailler avec les gens qui le font), ils peuvent donner l'accès pour les requêtes inter-domaine dans le navigateur à l'aide de De la SCRO (qui est uniquement pris en charge dans les navigateurs modernes) ou JSON-P (une ancienne solution de contournement qui est antérieure à la SCRO).
Le fournisseur tiers pourrait également vous donner accès aux données que vous voulez à un point de terminaison qui est conçu pour accepter les demandes provenant d'autres serveurs et qui fournit un mécanisme permettant de vous authentifier votre application. Le protocole le plus connu pour ce qui est OAuth.
requests.get()
serait de travailler (et de déclencher la route de nouveau), mais même url, commerequests.get("localhost:5000/myroute")
ne causent pas d'appels récursifs. Il semble que les demandes ne fonctionnent pas...Que les autres réponses ont indiqué à l'aide de la demandes de module python serait la meilleure façon de s'attaquer à ce du point de vue du code. Cependant, comme les commentaires mentionnés (et la raison pour laquelle je suis à cette question), ce qui peut donner une erreur que la demande a été refusée. Cette erreur est probablement à l'origine par SELinux.
Pour vérifier si c'est la question d'abord assurez-vous que SELinux est activé avec cette commande:
Si "Mode Actuel' est 'appliquer' puis SELinux est activé.
Prochaine obtenez le courant bool valeurs qui s'appliquent directement à apache avec cette commande:
Look pour le réglage de la "httpd_can_network_connect' elle détermine si apache est autorisé à faire les requêtes TCP hors du réseau. Si c'est sur, puis tous les apache TCP demandes seront autorisés. Pour l'activer, exécutez les opérations suivantes en tant que root:
Si vous avez seulement besoin d'accès de base de données (j'ai eu ce problème avant, et c'est pourquoi je m'en doutais SELinux ici), alors il serait probablement mieux de ne faire que sur "httpd_cna_network_connect'.
Le but de cette politique est que si un hacker de prendre le contrôle de votre serveur apache, ils ne seraient pas en mesure de sortir par le serveur pour le reste de votre réseau interne.
Cela aurait probablement été mieux comme commentaire mais je n'ai pas assez de rep..
Sources:
https://tag1consulting.com/blog/stop-disabling-selinux
https://wiki.centos.org/TipsAndTricks/SelinuxBooleans