Creación de un servidor web Python – diseño y configuración

¿Voy a hacer esto de la manera correcta? Nunca he hecho algo como esto antes, así que no estoy 100% seguro de lo que estoy haciendo. Hasta ahora, el código obtiene los archivos html y css y funciona bien, pero las imágenes no se cargan, ¿y tendré que crear un nuevo “if” para cada tipo de archivo diferente? o estoy haciendo esto de una manera tonta … esto es lo que tengo:

import string,cgi,time from os import curdir, sep from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import os import mimetypes #import pri port = 888 host = "0.0.0.0" class MyHandler(BaseHTTPRequestHandler): def do_GET(self): try: #RequestedURL = self.path mimeType = mimetypes.guess_type(self.path)[0] fileType = mimetypes.guess_extension(mimeType) infoList = [mimeType, fileType] if infoList[1] != ".py": self.send_response(200) self.send_header('Content-type', mimeType) self.end_headers() f = open(curdir + sep + self.path, "rb") self.wfile.write(f.read()) f.close() return if fileType == ".py": pythonFilename = self.path.lstrip("/") self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() pyname = pythonFilename.replace("/", ".")[:-3] print pythonFilename print pyname temp1 = pyname.split(".") temp2 = temp1[-1] print temp2 module = __import__(root.index) self.wfile.write(module.root.index.do_work()) #module = __import__("test.index") #self.wfile.write( module.index.do_work()) return return except IOError: self.send_error(404,'File Not Found: %s' % self.path) def do_POST(self): global rootnode try: ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) if ctype == 'multipart/form-data': query=cgi.parse_multipart(self.rfile, pdict) self.send_response(301) self.end_headers() upfilecontent = query.get('upfile') print "filecontent", upfilecontent[0] self.wfile.write("POST OK.

"); self.wfile.write(upfilecontent[0]); except : pass def main(): try: server = HTTPServer((host, port), MyHandler) print 'started httpserver:' print ("Host: " + (host)) print ("Port: " + str(port)) server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down server' server.socket.close() if __name__ == '__main__': main()

html y css funcionan, pero las imágenes png no se cargan

Estás en el camino correcto, aunque tus ifs son muy redundantes. Le sugiero que refactorice el código para verificar el tipo usando un bucle y un dict:

 mime = {"html":"text/html", "css":"text/css", "png":"image/png"} if RequestedFileType in mime.keys(): self.send_response(200) self.send_header('Content-type', mime[RequestedFileType]) self.end_headers() print RequestedFileType f = open(curdir + sep + self.path) self.wfile.write(f.read()) f.close() return 

Además, estás enviando archivos binarios como texto. En lugar de abierto (curdir + sep + self.path) use open (curdir + sep + self.path, “b”)

Gergely de toptal.com

En cuanto a una serie de declaraciones if , el enfoque habitual es tener un archivo que maneje la asignación entre las extensiones y los tipos mime (consulte aquí: ¿ Lista de TODOS los tipos de Mime en el planeta, asignados a las extensiones de archivo? ). Lea eso en una estructura de datos apropiada.

Probablemente debería abrir todos los archivos como binarios a menos que sean de tipo text / * mime; para aquellos, debe asegurarse de que los finales de su línea sean los especificados en el RFC apropiado (si es que lo hay, hace años que no necesito consultar esos estándares, debido a que no escribo un servidor web para desplegar con ira).

Y un punto sintáctico:

 >>> ('foo') 'foo' >>> ('foo',) ('foo',) >>> 

Tus brackets son redundantes. Puede indexar el valor que está extrayendo.