2011-11-08 8 views
2

私は正しい方法でこれについて説明しますか?私はこれまでにこのようなことをしたことがないので、私がやっていることを100%確信していません。これまでのコードではhtmlやcssファイルが得られ、それはうまくいきますが、イメージは読み込まれません。また、異なるファイルタイプごとに新しい "if"を作成する必要がありますか?Pythonウェブサーバーを作成する - レイアウトとセットアップ

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() 

HTMLとCSS動作しますが、PNG画像は、if文の一式に関しては通常のアプローチを

+0

は、あなたがあなた自身のHTTPを展開するために十分な理由を持っていますかtoptal.comからオープン(CURDIR + 9月+ self.path)を使用し、オープン(CURDIR + 9月+ self.path、 "B")

Gergelyのサーバ?そこに多くの、多くの良いpython Webサーバーがあります。興味を持っイムは、それがどのように動作するかを確認するためにため –

+1

イムはそれをやって、アイブ氏は –

+0

私は関連のポストからF =オープン(CURDIR + 9月+ self.path、「RB」)で –

答えて

3

あなたのifは非常に冗長ですが、正しい軌道に乗っています。ループとディクテーションを使用してタイプをチェックするコードをリファクタリングすることをお勧めします。

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 

また、バイナリファイルをテキストとして送信しています。代わりに

1

をロードしません:または私は愚かな方法でこれをやっている...ここで私が持っているものです拡張子とMIMEタイプのマッピングを扱うファイルを用意することです(ここでは、List of ALL MimeTypes on the Planet, mapped to File Extensions?)。それを適切なデータ構造に読み込みます。

text/* mimeタイプでない限り、バイナリとしてすべてのファイルを開いているはずです。それらのためにあなたの行末を適宜RFCで指定されていることを確認する必要があります(もしあれば - 私はそれらの基準を相談する必要があったので、それは怒りで展開するウェブサーバを書いていないのために、年をされています)。

と構文のポイント:

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

あなたのブラケットが冗長です。あなたは抽出している値にインデックスを付けることができます。

+0

おかげで動作するようにイメージを持って[OK]を、病気持ちCherryPyはを見てそれを見て –

関連する問題