Python: Простой пример использования twisted

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

Вообще решил сделать отдельный сервис, висящий на отличном от 80 порту и выполняющий все что мне надо. Писать решил с использование сетевого фреймворка twisted. Штука прикольная, но вот незадача, нормальной документации и примеров как то нету, того что на их сайте есть, мне явно не хватает, для того чтобы понять как и что нужно делать. Поэтому решил для начала написать простенький примерчик, который будет висеть и слушать запросы и в зависимости от url увеличивать или уменьшать внутренний счетчик.

Вот что получилось:

__author__="mrdaark"
__date__ ="$15.07.2009 21:31:01$"
 
from twisted.web import server, resource
from twisted.internet import reactor
import string
 
class Consult():
    count= 0
        def add(self,x=1):
            self.__class__.count+=x
        def remove(self,x=1):
            self.__class__.count-=x
 
class Server(resource.Resource):
    isLeaf = True
        def getChild(self, name, request):
            if name == '':
                return self
            return Resource.getChild(self, name, request)
        def render(self, request):
            urlpath=string.split(request.path[1:],'/')
            path=urlpath[ 0]
            if len(urlpath)>1:
                r=int(urlpath[1])
            else:
                r=1
 
            str='<html><head></head><body>'
            c=Consult()
            if (path=='add'):
                c.add(r)
            elif (path=='remove'):
                c.remove(r)
            str+= "x: %d<br />" % (c.count)
            str+='<a href="/add/1">add 1</a><br /><a href="/remove/1">remove 1</a></body></html>'
            return str
 
def main():
    site = server.Site(Server())
    reactor.listenTCP(8080, site)
    reactor.run()
 
if __name__ == "__main__":
    main()
 

Штука запускается, вешается на 8080 порт и принимает http запросы. Увеличивает и уменьшает внутренний счетчик в зависимости о второго параметра в урл, т.е. формат урл таков: /<функция>/<параметр>. По-умолчанию, параметр равен единице.

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

Опубликовал:
  • Ну бывают же совпадения ;).

    А за пост спасибо, пригодится пример.