Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2010 09:51:46

sergM
От:
Зарегистрирован: 2010-07-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с Twisted

C Twisted разбираюсь первый раз. Вот код:

import sys

from wx import Frame, DefaultPosition, Size, Menu, MenuBar, App
from wx import EVT_MENU, EVT_CLOSE

from twisted.python import log
from twisted.internet import wxreactor
wxreactor.install()

# import t.i.reactor only after installing wxreactor:
from twisted.internet import protocol, reactor, defer
from twisted.protocols import basic
from twisted.enterprise import adbapi
from twisted.web import xmlrpc, server
dbpool = adbapi.ConnectionPool("sqlite3", 'ren.db')
#import row_object

ID_EXIT = 101

def sql_gen(i):
return """select * from %s;""" % i

def select_bd(table):
return dbpool.runQuery(sql_gen(table))


def printResult(i):
if len(i):
print i
return `i`
else:
return '0'


class MyFrame(Frame):
def __init__(self, parent, ID, title):
Frame.__init__(self, parent, ID, title, DefaultPosition, Size(300, 200))
menu = Menu()
menu.Append(ID_EXIT, "E&xit", "Terminate the program")
menuBar = MenuBar()
menuBar.Append(menu, "&File")
self.SetMenuBar(menuBar)
EVT_MENU(self, ID_EXIT, self.DoExit)

# make sure reactor.stop() is used to stop event loop:
EVT_CLOSE(self, lambda evt: reactor.stop())

def DoExit(self, event):
reactor.stop()




class MyApp(App, xmlrpc.XMLRPC):
allowNone=False
useDateTime=False

def OnInit(self):
frame = MyFrame(None, -1, "Hello, world")
#frame.Show(True)
#self.SetTopWindow(frame)
# look, we can use twisted calls!

return True

def xmlrpc_select(self,table):
print self.server()

return select_bd(table).addCallback(printResult)


def demo():
log.startLogging(sys.stdout)

# register the App instance with Twisted:
app = MyApp(0)
reactor.registerWxApp(app)

reactor.listenTCP(8000, server.Site(app))

# start the event loop:
reactor.run()


if __name__ == '__main__':
demo()
Он работает. Несколько вопросов:
1. Все ли здесь правильно с асинхронностью?
2. Как извлечь имя хоста(IP адрес) клиента?
Документацию уже изучил вдоль и поперек. Слишком она запутана. Хоть бы один маленький пример боле мене приближенный к жизни.



Офлайн

#2 Июль 28, 2010 12:46:38

sergM
От:
Зарегистрирован: 2010-07-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с Twisted

На второй вопрос отвечу сам:

from wx import Frame, DefaultPosition, Size, Menu, MenuBar, App
from wx import EVT_MENU, EVT_CLOSE
import xmlrpclib
from twisted.python import log
from twisted.internet import wxreactor
wxreactor.install()

# import t.i.reactor only after installing wxreactor:
from twisted.internet import protocol, reactor, defer
from twisted.protocols import basic
from twisted.enterprise import adbapi
from twisted.web import xmlrpc, server
dbpool = adbapi.ConnectionPool("sqlite3", 'ren.db')
#import row_object

ID_EXIT = 101
def sql_gen(i):
return """select * from %s;""" % i

def select_bd(table):
return dbpool.runQuery(sql_gen(table))


def printResult(i):
if len(i):
print i
return `i`
else:
return '0'


class MyFrame(Frame):
def __init__(self, parent, ID, title):
Frame.__init__(self, parent, ID, title, DefaultPosition, Size(300, 200))
menu = Menu()
menu.Append(ID_EXIT, "E&xit", "Terminate the program")
menuBar = MenuBar()
menuBar.Append(menu, "&File")
self.SetMenuBar(menuBar)
EVT_MENU(self, ID_EXIT, self.DoExit)

# make sure reactor.stop() is used to stop event loop:
EVT_CLOSE(self, lambda evt: reactor.stop())

def DoExit(self, event):
reactor.stop()




class MyApp(App, xmlrpc.XMLRPC):
allowNone=False
useDateTime=False

def OnInit(self):
frame = MyFrame(None, -1, "Hello, world")
#frame.Show(True)
#self.SetTopWindow(frame)
# look, we can use twisted calls!

return True

def xmlrpc_select(self,table):

return select_bd(table).addCallback(printResult)

def render(self, request):
print request.getHost().host
Fault = xmlrpclib.Fault
args, functionPath = xmlrpclib.loads(request.content.read())
try:
function = self._getFunction(functionPath)
except Fault, f:
self._cbRender(f, request)
else:
request.setHeader("content-type", "text/xml")
defer.maybeDeferred(function, *args).addErrback(
self._ebRender
).addCallback(
self._cbRender, request
)

return server.NOT_DONE_YET


def demo():
log.startLogging(sys.stdout)

# register the App instance with Twisted:
app = MyApp(0)
reactor.registerWxApp(app)

reactor.listenTCP(8000, server.Site(app))

# start the event loop:
reactor.run()


if __name__ == '__main__':
demo()
Прошу проанализировать код на предмет правильности написания Defereds



Офлайн

#3 Июль 30, 2010 21:14:23

sergM
От:
Зарегистрирован: 2010-07-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с Twisted

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



Офлайн

#4 Июль 30, 2010 22:43:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Помогите разобраться с Twisted

А что вы хотите? Ваш код, похоже, работает.
И он совсем простой - вопросов нет.
Некоторое недоумение вызывает только то, зачем потребовалось переопределять .render?
Почему стандартного xmlrpc.XMLRPC не хватило?



Офлайн

#5 Июль 31, 2010 10:15:28

sergM
От:
Зарегистрирован: 2010-07-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с Twisted

Андрей Светлов
Некоторое недоумение вызывает только то, зачем потребовалось переопределять .render?
Почему стандартного xmlrpc.XMLRPC не хватило?
честно говоря мне этот путь тоже кажется несколько через ж…
Задача создать список активных подключений(адресов хостов). Дальше он будет использоваться для передачи сигналов по UDP.
xmlrpc.XMLRPC документацию смотрел, но если где Twisted и оправдывает свое название (кривой), так это в документации. Большая часть функций-“Undocumented”. Разобраться новичку в Twisted просто невозможно.
Путь взят из примера
если есть более изящный пожалуйста покажите.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version