Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Апрель 2, 2007 14:57:39

Igorek
От:
Зарегистрирован: 2006-12-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: Загрузка .putChild из базы

Начитавшись softwaremaniacs.org, про “Контролируемое скачивание”, очень захотелось попробовать сделать это же, но на twisted, так вот возникла сразу тьма вопросов.

Допустим я загружаю список файлов из БД, которые будут доступны для скачивания по http:
Вопрос 1.
Вот код что ниже загружает (это я так думаю) список файлов. Как мне узнать, что они точно загрузились в putChild, а не валяются где-то в космосе.

#!/usr/bin/env python
# -*- charset : utf8 -*-
from twisted.web import server, resource, static, http
from twisted.internet import reactor
from twisted.python import log
import os,MySQLdb,sys
log.startLogging(sys.stdout)

class readDirs(resource.Resource):
children = {
‘path’: ‘/srv/ftp/’,
}

def __init__(self, db):
self.db = db
res = self.db.cursor()
res.execute(“SELECT path FROM down_p”)
rows = res.fetchall()
for i in rows:
self.putChild(i,static.File(i))
print “File load completed”


db = MySQLdb.connect(dbhost,dbuser,dbpswd,dbname)

child = readDirs(db)
print type(child)
site = server.Site(child)
reactor.listenTCP(8080, site, 0)
reactor.run()


Вопрос 2.
Можно ли узнать, что файл был уже скачан и какая ф-я отвечает ?



Офлайн

#2 Апрель 2, 2007 17:24:29

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Twisted: Загрузка .putChild из базы

Ух.

Twisted это, конечно, хорошо. Но есть одно большое (очень большое) “НО”: у него высокий уровень вхождения. Тут и не совсем привычная идеология (отложенные результаты, call/err-backs), и не очень “дружественная” документация. И Twisted этот тот случай, когда перед тем как садится писать, нужно очень внимательно прочитать документацию. Либо работать рядом с человеком, который знает Twisted и который бы помогал в обучении.

Теперь что касается конкретного примера. Во-первых, твой код _не_асинхронный_. Он синхронный. У тебя операции с БД синхронные. Нужно или использовать twisted.enterprise, либо делать thread-to-defer. Во-вторых, просто попроси у Ивана код с примером. В этом случае ты сможешь уделить внимание особенностям Twisted и своей задачи. В-третьих, в Twisted есть пример фабрики (ThrottlingFactory) с ограничением скорости. Однако есть не закрытые тикеты #601 и #1493, так что по-любому, придется сильно переписывать static.File. Чувствуешь ли в себе силы? ;)

P.S. А есть еще twisted.web2.static. Use the code, Luke!



Отредактировано (Апрель 2, 2007 17:24:50)

Офлайн

#3 Апрель 2, 2007 19:43:23

Igorek
От:
Зарегистрирован: 2006-12-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: Загрузка .putChild из базы

Хорошо. А что тогда можно попробовать для начала, ежели twisted несколько сложноват (я вот действительно ощущаю, что документацию пишут “недружественно”)



Офлайн

#4 Апрель 2, 2007 20:12:23

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Twisted: Загрузка .putChild из базы

С asyncore :)



Офлайн

#5 Апрель 3, 2007 06:22:19

Igorek
От:
Зарегистрирован: 2006-12-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: Загрузка .putChild из базы

Тогда еще один вопрос, где можно взять толковую документацию по сему модулю. Если есть возможность, то на русском языке

Всё спасибо. Нашёл.



Отредактировано (Апрель 3, 2007 06:29:50)

Офлайн

#6 Апрель 3, 2007 17:58:43

Igorek
От:
Зарегистрирован: 2006-12-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted: Загрузка .putChild из базы

Вот переписал на asyncore.

import asyncore
import sys
import MySQLdb
import socket

__version__ = ‘0.01’
__platform__ = sys.platform

class readDirs:
pass


class handler(asyncore.dispatcher):

def _send_headers(self):
pass

def _writeheaders(self):
self.send('Content-type: text/html')

def __init__(self, sock_obj):
asyncore.dispatcher.__init__(self, sock=sock_obj)

def handle_write(self):
self._writeheaders()
self.handle_close()

def handle_read(self):
buffer = self.recv(8192)

def handle_close(self):
self.close()

class project_1Server(asyncore.dispatcher):

def __init__(self, port=85):
asyncore.dispatcher.__init__(self)
self.port = port
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind((“”, port))
self.listen(5)
print “%s (port = %s)”%(__server_string__,port)

def handle_accept(self):
sock_obj, addr = self.accept()
print addr,“ - ”,addr
handler(sock_obj)


try:
request = project_1Server()
asyncore.loop(timeout=2)
except KeyboardInterrupt:
print “Crtl+C pressed. Shutting down.”

Теперь вопрос, как правильно включить class readDirs - подразумевается что там будет происходить чтение из базы списка файлов, доступных на сервере.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version