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