Je suis relativement nouveau à Python mais j'ai fait beaucoup de choses avec ça récemment et je l'aime beaucoup. Cependant, j'ai rencontré des problèmes/bloc avec le code suivant.html dans la méthode do_GET() d'un simple serveur web Python
import http.server
import socketserver
import glob
import random
class Server(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200, 'OK')
self.send_header('Content-type', 'html')
self.end_headers()
self.wfile.write(bytes("<html> <head><title> Hello World </title> </head> <body>", 'UTF-8'))
images = glob.glob('*.jpg')
rand = random.randint(0,len(images)-1)
imagestring = "<img src = \"" + images[rand] + "\" height = 1028 width = 786 align = \"right\"/> </body> </html>"
self.wfile.write(bytes(imagestring, 'UTF-8'))
def serve_forever(port):
socketserver.TCPServer(('', port), Server).serve_forever()
if __name__ == "__main__":
Server.serve_forever(8000)
Ce que je suis en train de faire ici est de saisir une image aléatoire à partir de plusieurs images dans le répertoire et l'ajouter dans la réponse à une requête Web. Le code fonctionne correctement mais lorsque j'accède au serveur via le navigateur, l'image n'est pas affichée. Le html de la page est comme prévu cependant. Les autorisations sur les fichiers sont 755. J'ai également essayé de créer un fichier index.html dans la méthode do_GET. Cela n'a pas fonctionné non plus. Je veux dire que l'index.html a été généré correctement, mais la réponse dans le navigateur n'a pas montré quoi que ce soit (pas même le monde de Hello dans le titre). Est-ce que je manque quelque chose de très simple ici? Je pensais que je devrais surcharger le handle_request du SocketServer.BaseServer sous-jacent comme la documentation dit que vous ne devriez jamais surcharger la méthode handle() de BaseHTTPServer et devrait plutôt remplacer la méthode do_ * correspondante?
En ce qui concerne les images, je pense que le serveur envoie l'image sous forme de données binaires dans la même connexion TCP ou dans une connexion TCP différente (selon que vous utilisez un HTTP persistant ou non persistant). Dans les deux cas, l'image est enroulée autour des en-têtes HTTP habituels. Mais je vois votre point de vue, il doit encore envoyer le fichier image. Si vous voyez les réponses du serveur dans le terminal, vous pouvez voir qu'il répond avec un 200 pour les demandes de fichiers d'image. –
Que se passe-t-il lorsque vous wget/curl l'URL de l'image telle que servie par votre script (c'est-à-dire, celle vers laquelle vous naviguez dans le navigateur)? Le fichier résultant est-il visible en tant qu'image ou ressemble-t-il au code HTML lorsque vous l'ouvrez dans un éditeur de texte? – Sasha
Bien en utilisant wget/curl, il envoie simplement html. Une enquête plus approfondie utilisant tcpflow et lisant les messages transmis sur l'interface de bouclage, j'ai constaté que le serveur n'envoie pas réellement l'image (en tant que données binaires). Ce que je vois est la deuxième requête du navigateur pour l'image. Maintenant, je pourrais vérifier la demande entrante comme une demande pour une des images mais le problème est comment réellement envoyer l'image sur le fil? Il s'avère que http.server n'a aucune méthode de codage. Une lecture plus approfondie me pointe vers l'utilisation de httplib. –