Форум сайта python.su
Начитавшись 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.
Можно ли узнать, что файл был уже скачан и какая ф-я отвечает ?
Офлайн
Ух.
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)
Офлайн
Хорошо. А что тогда можно попробовать для начала, ежели twisted несколько сложноват (я вот действительно ощущаю, что документацию пишут “недружественно”)
Офлайн
С asyncore :)
Офлайн
Тогда еще один вопрос, где можно взять толковую документацию по сему модулю. Если есть возможность, то на русском языке
Всё спасибо. Нашёл.
Отредактировано (Апрель 3, 2007 06:29:50)
Офлайн
Вот переписал на 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 - подразумевается что там будет происходить чтение из базы списка файлов, доступных на сервере.
Офлайн
Офлайн