понедельник, 10 декабря 2012 г.

Python BaseHTTPServer

Сегодня мы продемонстрируем как создать простой сервер на Python,  используя библиотеку BaseHTTPServer.

Наш сервер будет способен принимать, как GET-запросы для отображения страниц, так и POST-запросы для отправки файлов через форму.

Если файл, запрашиваемый через GET-запрос, будет найден на сервере, то сервер будет посылать браузеру код 200 OK. Если файл не будет найден сервером, то он пошлет код 404 Not found.

При успешно получении файла сервером через POST-запрос сервер пошлет браузеру код 301.

Давайте посмотрим на код нашего сервера и вспомогательных файлов.

Файл webserver.py

import string,cgi,time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
#import pri

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        try:
            if self.path.endswith(".html"):
                f = open(curdir + sep + self.path) #self.path has /test.html
#note that this potentially makes every file on your computer readable by the internet

                self.send_response(200)
                self.send_header('Content-type',    'text/html')
                self.end_headers()
                self.wfile.write(f.read())
                f.close()
                return
            if self.path.endswith(".esp"):   #our dynamic content
                self.send_response(200)
                self.send_header('Content-type',    'text/html')
                self.end_headers()
                self.wfile.write("hey, today is the" + str(time.localtime()[7]))
                self.wfile.write(" day in the year " + str(time.localtime()[0]))
                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(('', 80), MyHandler)
        print 'started httpserver...'
        server.serve_forever()
    except KeyboardInterrupt:
        print '^C received, shutting down server'
        server.socket.close()

if __name__ == '__main__':
    main()


Файл index.html

<html>

This is a simple HTML page.

</html>


Файл upload.html

 <html>
<body>

<form method="post" enctype="multipart/form-data" action="http://127.0.0.1/">

File to upload: <input type="file" name="upfile">
<br />
<br />
<input type="submit" value="Press"> to upload the file!

</form>

</body>
</html>


Функция main() пытается запустить сервер на порту 80. Для завершения работы сервера вы можете зажать Ctrl + C, находясь в консоли. В этом случае сервер закроет сокет соединения с браузером и выйдет из программы.

Метод do_GET() запускается когда браузер посылает GET-запрос. Он проверяет тип запрашиваемого браузером файла. Если запрашивается HTML-файл, то метод пытается открыть его, прочитать его содержимое и отправить это содержимое браузеру. Если, тип файла exp, то браузеру будет просто посланы текущий день и год.

Метод do_POST() запускается когда браузер посылает POST-запрос. Он отображает содержимое загруженного файла. Имя файла прописано как  "upfile".

Запускаем пример сервера.

В консоли набираем:

python webserver.py


Затем запускаем любой браузер и переходим по адресу

http://localhost/index.html

или

http://localhost/index.esp

Для тестирования загрузки файла на сервер вы должны перейти по адресу:

http://localhost/upload.html 

После этого на странице нажмите на кнопку "browse", выберите любой небольшой текстовый файл и нажмите на кнопку "press". После этого сервер отобразит в браузере содержимое выбранного файла.

Комментариев нет:

Отправить комментарий