2009-02-04

Простой вебсервер на Питоне

Возникла необходимость сделать простой вебcервер, но чтобы он был максимально легкий и быстрый. После некоторых размышлений решил реализовать его на Питоне, первоначально в качестве кандидатов рассматривались PHP, Java, Perl, но в конечном итоге решил остановиться на Python.

Приведенный пример работает на Python 2.5, хотя первоначально был сделан на Python 3. Питон выбрал потому что во первых хотелось посмотреть что это за зверь такой, что его так любят разработчики Google a во вторых понравилось что можно с легкостью создавать многонитивые приложения.

Синтаксис языка оказался довольно забавный, так как в нем нет операторных скобок так что тем кто любит сравнивать фигурные скобки Си с паскалевским begin/end останутся без темы для споров - операторных скобок нет как класса.

Понравилась философия разработчиков Battaries Included - например разработчику для создания простого вебсервера не нужно вникать в тонкости протоколов - достаточно взять один из готовых классов. Однако по какой то странной причине разработчики Питона не любят реляционные базы данных, например нет в Питоне интерфейса к MySQL а сторонние разработкики делают расширения весьма неохотно, поэтому третью версию питона с MySQL никак не соединить - максимум что позволено версия 2.5 и когда будет поддержка для третьей - неизвестно.

#! /usr/local/bin/python

import BaseHTTPServer
import cgi
import string

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def showPage(self,method,get_data,post_data):
        self.wfile.write("HTTP/1.1 200 OK\n");
        self.wfile.write("Content-Type: text/html\n")
        self.wfile.write("\n");        

        responce = """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Simple HTTP Server</title>
<meta name="description" content="Simple HTTP Server" />
</head>
<body style="background:white;">				
Method $method<br />
Path: $path<br />
get data $get_data<br />
post data $post_data<br />

<form action="" method="post">
<input type="text" name="value1">
<input type="submit" name="value2">
</form>
</body>
</html>
        """
        s = string.Template(responce)
        responce = s.substitute(dict(
            get_data=get_data,
            post_data=post_data,
            path=self.path,
            method=method
            )) 
        self.wfile.write(responce);
                
    def do_GET(self):
        get_data = cgi.parse_qs(self.path[2:])
        self.showPage('GET',get_data,{})
        

    def do_POST(self):
        get_data = cgi.parse_qs(self.path[2:])
        cl, cl2 = cgi.parse_header(self.headers.get('content-length'))
        qs = self.rfile.read(int(cl))
        post_data = cgi.parse_qs(qs.decode())
        self.showPage('GET',get_data,post_data)


class ChatServer(BaseHTTPServer.HTTPServer):
    def __init__(self,address,handler):
        BaseHTTPServer.HTTPServer.__init__(self,address,handler)
        

def main():
    try:
        server = ChatServer(('localhost', 8080), RequestHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        print('^C received, shutting down server')
        server.socket.close();

if __name__ == '__main__':
    main()

 

 

комментарии:

 
Bomfunk (анонимный пользователь) | 2009-02-04
Прошу прощения за оффтоп, но для RSS лучше использовать htmlspecialchars, чтобы не было чего-то вроде этого:
bpic
А ещё неплохо было бы сделать предпросмотр комментария, ведь здесь не используется распространённая разметка.
max | 2009-02-04
Прошу прощения за оффтоп, но для RSS лучше использовать htmlspecialchars, чтобы не было чего-то вроде этого:

Это просто я при наборе блога забыл код пропустить через WYSIWYG поэтому вся запись так и выглядела, правда я быстро все исправил, так что сейчас все должно нормально выглядеть. Насчет предпросмотра... подумаем, а какая разметка считается распространенной?

 

max | 2009-02-04

Ан нет, - действительно показываются теги - починил.

Bomfunk (анонимный пользователь) | 2009-02-04
Я подразумевал под распространёнными разметки BBCode, Textile, Wiki-разметку и прочие, которые не пишутся руками, а скачиваются и устанавливаются, которыми пользуется не единичный сайт. Если здесь для комментариев используется "распространённая" разметка, то можно просто привести ссылку на страницу, на которой как раз и можно произвести предпросмотр.
Атиух (анонимный пользователь) | 2009-02-05

» понравилось что можно с легкостью создавать многонитивые приложения. угу, а теперь прочитай, что такое GIL и как он влияет на многонитевое быстродействие на питоне. И почему его не удолят.

» Синтаксис языка оказался довольно забавный, так как в нем нет операторных скобок зато есть форсированное выравнивание кода двумя пробелами

» нет в Питоне интерфейса к MySQL Batteries included?

» а сторонние разработкики делают расширения весьма неохотно так batteries же included, зачем что-то еще делать.

P.S. Код выглядит ужасно

P.P.S. Распостранённые разметки, это в которых можно нормально написать комментарий без знания HTML и JavaScript.

max | 2009-02-05

>> зато есть форсированное выравнивание кода двумя пробелами

Вообще то четырьмя...

>>P.S. Код выглядит ужасно

Обоснуй плиз что ужасного в коде?

>>P.P.S. Распостранённые разметки, это в которых можно нормально написать комментарий без знания HTML и JavaScript.

А ты какой браузер используешь? По идее должен быть WYSIWYG показываться... и при чем здесь JavaScript?

 

Атиух (анонимный пользователь) | 2009-02-06
Konqueror. WYSIWYG нету. Подозреваю, что он завязан на JavaScript.

>Вообще то четырьмя...
Еще лучше

>Обоснуй плиз что ужасного в коде?
Например: __init__ (двойные прочерки, да еще и с двух сторон! Это ASCII-арт уже какой-то), self, который понапихан во все места, вызов dict() для создания хеша (вспомним php и array()). А вот это

if __name__ == '__main__':
main()

вообще замечательно. Прям вспоминается Си и Include guards.
Hellbender (анонимный пользователь) | 2009-02-18

А для меня например, после месяца на питоне, ВСЕ императивные языки кажутся недоделанными. 

 

 

Атиух (анонимный пользователь) | 2009-02-23
Да, сильно питон воздействует на неокрепший моск.

P.S. Щас подумал: а при программировании на бумаге питонеры тоже считают пробелы и прочерки?
HellBender (анонимный пользователь) | 2009-02-25

Атиух, ты сам-то хоть раз в жизни на питоне писал? После 7-ти лет  C/С++, Java и C#, Python действительно хорошо воздействует на окрепший мозг. 

 

Атиух (анонимный пользователь) | 2009-02-25
Нет, питон мне сразу не понравился.

После паскаля и С++ язык, однако о его великих качествах это ничего не говорит. В сравнении с другими языками своего уровня (Ruby) питон сливает.
Атиух (анонимный пользователь) | 2009-02-25
P.S. А в RSS поломаны ссылки.
max | 2009-02-26

В принципе, идея избавится от операторных скобок мне нравится - никаких тебе споров о том как их ставить на одной линии с оператором к которому она относится или на другой. Тоже относится и точке с запятой в конце строки - в джаваскрипт например так и не решили нужна она или не и сделати ееопциональной но это потенциально привот к ошибкам например при использовании минификации кода.

Вот отсутствие блоковых комментариев (вместо них, по сути, используются строки), на мой взгляд, не очень позитивно сказывается на объеме используемой памяти и на быстродействии. А вообще, язык довольно быстро развивается и набирает популярность, так что у него есть все шансы со временем обогнать тот же PHP или Java.

Кстати, после Питона, действительно несколько раз забыл поставить скобки в PHP и JavaScript сильно удивлялся почему программа не работает как нужно - правда быстро исправился.

На бумаге программировать не нужно - это только в школах и в вузах из-за недостака компьютеров заставляют программировать на бумаге. На бумаге удобнее всего рисовать блок-схемы, отвращение к которым, правда, тоже многим вбивают на уроках программирования - на самом деле блок-схемы отличная вещь без которой практически не обойтись при работе над действительно сложными программами.

Атиух (анонимный пользователь) | 2009-02-26
Блок-схемы никто не отменял, но код тоже иногда надо писать на бумаге Про фичи питона: они далеко не его эксклюзивные, советую для сравнения попробовать Ruby. У него гораздо более широки возможности, а не "делайте как завещал Гвидо". > так что у него есть все шансы со временем обогнать тот же PHP или Java. PHP да, а вот насчет явы сомневаюсь. Это таки платформа, а не просто язык.

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться