Надо мне написать небольшой сервер, который будет принимать некие данные, сохранять их, а потом по определеным командам отдавать. Сейчас есть нечто такое же, только реализованное на 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 запросы. Увеличивает и уменьшает внутренний счетчик в зависимости о второго параметра в урл, т.е. формат урл таков: /<функция>/<параметр>. По-умолчанию, параметр равен единице.
Вот такая штука вообщем получилась. Теперь буду усложнять этот примерчик, чтобы он сохранял и выводил список элементов, так и родится нужный мне функционал. 🙂