Python: Простой пример использования twisted
Надо мне написать небольшой сервер, который будет принимать некие данные, сохранять их, а потом по определеным командам отдавать. Сейчас есть нечто такое же, только реализованное на LAMP, работает прямо скажем не очень быстро. Можно конечно сделать какое-то кеширование, memcache и т.д., но мне не хватает свободы маневра в текущей структуре, поэтому я решил таки переписать серверную часть, ибо клиентская вполне себе меня удовлетворяет.
Вообще решил сделать отдельный сервис, висящий на отличном от 80 порту и выполняющий все что мне надо. Писать решил с использование сетевого фреймворка twisted. Штука прикольная, но вот незадача, нормальной документации и примеров как то нету, того что на их сайте есть, мне явно не хватает, для того чтобы понять как и что нужно делать. Поэтому решил для начала написать простенький примерчик, который будет висеть и слушать запросы и в зависимости от url увеличивать или уменьшать внутренний счетчик.
Вот что получилось:
1: # To change this template, choose Tools | Templates
2: # and open the template in the editor.
3:
4: __author__="mrdaark"
5: __date__ ="$15.07.2009 21:31:01$"
6:
7: from twisted.web import server, resource
8: from twisted.internet import reactor
9: import string
10:
11: class Consult():
12: count=0
13:
14: def add(self,x=1):
15: self.__class__.count+=x
16:
17: def remove(self,x=1):
18: self.__class__.count-=x
19:
20: class Server(resource.Resource):
21: isLeaf = True
22:
23: def getChild(self, name, request):
24: if name == '':
25: return self
26: return Resource.getChild(self, name, request)
27:
28: def render(self, request):
29: urlpath=string.split(request.path[1:],'/')
30: path=urlpath[0]
31: if len(urlpath)>1:
32: r=int(urlpath[1])
33: else:
34: r=1
35:
36: str='<html><head></head><body>'
37:
38: c=Consult()
39: if (path=='add'):
40: c.add(r)
41: elif (path=='remove'):
42: c.remove(r)
43:
44: str+= "x: %d<br />" % (c.count)
45:
46: str+='<a href="/add/1">add 1</a><br /><a href="/remove/1">remove 1</a></body></html>'
47: return str
48:
49: def main():
50: site = server.Site(Server())
51: reactor.listenTCP(8080, site)
52: reactor.run()
53:
54: if __name__ == "__main__":
55: main()
Штука запускается, вешается на 8080 порт и принимает http запросы. Увеличивает и уменьшает внутренний счетчик в зависимости о второго параметра в урл, т.е. формат урл таков: /<функция>/<параметр>. По-умолчанию, параметр равен единице.
Вот такая штука вообщем получилась. Теперь буду усложнять этот примерчик, чтобы он сохранял и выводил список элементов, так и родится нужный мне функционал.