2011-11-08 2 views
2

Est-ce que je vais dans ce sens? Je n'ai jamais rien fait de tel auparavant, donc je ne suis pas sûr à 100% de ce que je fais. Le code jusqu'ici obtient des fichiers html et css et cela fonctionne bien, mais les images ne chargeront pas, et devrais-je créer un nouveau "si" pour chaque type de fichier différent? ou je fais cela une façon idiote ... voici ce que j'ai:Création d'un serveur web Python - mise en page et configuration

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("<HTML>POST OK.<BR><BR>"); 
     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() 

œuvres html et css, mais les images .png ne pas charger

+0

Avez-vous une bonne raison de rouler votre propre HTTP serveur? Il y a beaucoup, beaucoup de bons serveurs Web de python dehors là. –

+1

Im juste le faire parce que je suis intéressé de voir comment cela fonctionne, j'ai vu cherryPy –

+0

ok j'ai eu des images pour travailler avec f = ouvert (curdir + sep + self.path, 'rb') à partir d'un poste connexe –

Répondre

3

Vous êtes sur la bonne voie avec, bien que vos si sont très redondants. Je vous suggère de refactoring du code pour vérifier le type en utilisant une boucle et 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 

En outre, vous envoyez des fichiers binaires sous forme de texte. Au lieu d'ouvrir (curdir + + self.path septembre), utilisez ouverte (curdir + + self.path septembre, "b")

Gergely de toptal.com

1

Quant à toute une panoplie de if déclarations, l'approche habituelle est d'avoir un fichier qui gère le mappage entre les extensions et les types mime (regardez ici: List of ALL MimeTypes on the Planet, mapped to File Extensions?). Lisez cela dans une structure de données appropriée.

Vous devriez probablement ouvrir tous les fichiers en tant que binaires sauf s'il s'agit d'un type text/* mime; pour ceux que vous devriez vous assurer que vos fins de ligne sont comme spécifié dans la RFC appropriée (le cas échéant - cela fait des années que j'ai eu besoin de consulter ces normes, pour ne pas écrire un serveur web pour le déploiement).

Et un point syntactique:

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

Vos supports sont redondants. Vous pouvez indexer sur la valeur que vous extrayez.

+0

Merci, mal un coup d'oeil à ça –