Создание веб-сервера Python - макет и настройка - PullRequest
2 голосов
/ 08 ноября 2011

правильно ли я поступаю?Я никогда не делал ничего подобного раньше, поэтому я не уверен на 100% в том, что я делаю.Код до сих пор получает файлы html и css, и это прекрасно работает, но изображения не загружаются, и мне придется создавать новое «если» для каждого другого типа файлов?или я делаю это глупо ... вот что у меня есть:

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 не загружаются

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Вы находитесь на правильном пути, хотя ваши 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

Кроме того, вы отправляете двоичные файлы в виде текста. Вместо open (curdir + sep + self.path) используйте open (curdir + sep + self.path, "b")

Гергей с toptal.com

1 голос
/ 08 ноября 2011

Что касается набора операторов if, обычный подход состоит в том, чтобы иметь файл, который обрабатывает сопоставление между расширениями и типами MIME (смотрите здесь: Список ВСЕХ MimeTypes на Планете, сопоставленных с Расширениями Файла?).Прочтите это в соответствующую структуру данных.

Вероятно, вам следует открывать все файлы в двоичном формате, если они не являются текстовыми / * mime-типами;для них вы должны убедиться, что ваши окончания строк соответствуют указанным в соответствующем RFC (если таковые имеются - прошло много лет с тех пор, как мне приходилось консультироваться с этими стандартами из-за того, что я не писал веб-сервер для развертывания в гневе).

И синтаксическая точка:

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

Ваши скобки излишни.Вы можете индексировать значение, которое вы извлекаете.

...