Hello,
J'ai réalisé un petit webservice qui, en fonction des paramètre de requête, renvoie un fichier à l'utilisateur.
Il ressemble à ça (j'ai laissé que les parties intéressantes) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #!/usr/bin/env python # -*- coding: utf-8 -* from http.server import BaseHTTPRequestHandler, HTTPServer import os import os.path as op from urllib.parse import parse_qs, urlparse PORT_NUMBER = 8080 class RequestHandler(BaseHTTPRequestHandler): def display_msg(self, text): 'Display a ``text`` on the web page.' self.send_header('Content-type', 'text/plain; charset=utf-8') self.send_header('Content-Disposition', 'inline') self.end_headers() self.wfile.write(bytes(text, 'UTF-8')) def send_file(self, file_path, file_name): '''Send a file to the user (open the *Download File dialog box*). - ``file_path``: The path of the file to send to the user. - ``file_name``: The name of the file. ''' self.send_header('Content-type', 'Application/xml') self.send_header('Content-Disposition', 'attachment; filename="%s"' % file_name) self.end_headers() with open(file_path, 'rb') as f: self.wfile.write(f.read()) def do_GET(self): 'On GET events, get the arguments and generate a file.' self.send_response(200) # Get URL arguments url_args = parse_qs(urlparse(self.path).query, keep_blank_values=True) # Generate the file from URL GET arguments file_path, file_name, error = build_file(url_args) if error is not None: self.display_msg('ARGUMENT ERROR: %s.' % error) # Check if the converted file is present on the disk if not op.isfile(file_path): self.display_msg('CONVERSION ERROR: The file has not been generated.') return # Returns the converted file then remove it self.send_file(file_path, file_name) os.remove(file_path) if __name__ == '__main__': # Launch the web server try: server = HTTPServer(('', PORT_NUMBER), RequestHandler) print('Web server started. Please go to 127.0.0.1:%i.' % PORT_NUMBER) server.serve_forever() except KeyboardInterrupt: print('Interrupted by the user - shutting down the web server.') server.socket.close() |
Comme vous pouvez le voir, ce script monte un serveur web sur le port 8080.
Je dois maintenant installer mon script sur un serveur de prod, sur lequel est déjà installé un serveur web Apache. Je dois donc modifier mon script afin qu'il utilise Apache plutôt que de créer un nouveau webservice.
J'ai correctement configuré le serveur de manière à ce qu'il puisse exécuter du Python. Ainsi ce bout de code :
1 2 3 4 5 6 7 8 | import cgitb cgitb.enable() # https://docs.python.org/2/library/cgitb.html print ("Content-Type: text/plain; charset=utf-8") print ("") print("Hello World!") |
Affiche correctement Hello World!
sur la page web.
Comment puis-je écouter les requêtes GET et envoyer des données à l'utilisateur (j'imagine qu'il y a une méthode pour ne pas avoir à écrire les en-têtes HTTP à la main) en utilisant le serveur Apache existant ? La doc de cgitb est très peu fournie sur ce sujet.
Merci !