Найти - Пользователи
Полная версия: Twisted: Загрузка .putChild из базы
Начало » Web » Twisted: Загрузка .putChild из базы
1
Igorek
Начитавшись 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.
Можно ли узнать, что файл был уже скачан и какая ф-я отвечает ?
j2a
Ух.

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!
Igorek
Хорошо. А что тогда можно попробовать для начала, ежели twisted несколько сложноват (я вот действительно ощущаю, что документацию пишут “недружественно”)
j2a
С asyncore :)
Igorek
Тогда еще один вопрос, где можно взять толковую документацию по сему модулю. Если есть возможность, то на русском языке

Всё спасибо. Нашёл.
Igorek
Вот переписал на 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 - подразумевается что там будет происходить чтение из базы списка файлов, доступных на сервере.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB