Архив

Публикации с меткой ‘twisted’

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

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