Ahoj Jirko, pokud vim, tak Django resi pouze prijem souboru, ale nikde nevystupuje jako sitovy klient. Koukal jsem do django/core/files a nechal prohledat zdrojaky na PUT / POST a zadny relevantni kod jsem bohuzel opravdu nenasel.
Kazdopadne jsem nasel jeden storage backend pro Django, ktery resi ten samy problem a nasel jsem modul "Poster" ( http://pypi.python.org/pypi/poster/0.6.0). Takze jeste jsem to nezkousel, ale problem je zrejme vyresen. Jenom jsem rozcarovan, ze http streaming neresi pythoni standardni knihovna (co vim, tak ani nove moduly pro Python3) a ze budu nutit uzivatele instalovat dalsi externi balik. Pravdepodobne zkombinuju mmap a poster ("chcete podporu extra velkych souboru? Doinstalujte si Poster"). Marek 2010/9/28 Jirka Vejrazka <[email protected]> > Ahoj, > > Ja ted nejsem u pocitace, ale podival bych se jak to resi Django a > podobne. Jelikoz je pod BSD licenci, tak neni problem to reseni > okopirovat, pokud bude pouzitelne. > > Jirka > > > On 28/09/2010, slush <[email protected]> wrote: > > Zdravim, > > > > resim uz pekelne dlouho problem, jak z Pythonu uploadovat velky soubor > pres > > PUT/POST - pokud mozno nejakym standardnim zpusobem. > > > > Problem jsem zatim vyresil pomoci mmap. Nelibi se mi ale, ze na 32bit > > systemech je maximalni velikost uploadovaneho souboru ~4GB. Zaroven jsem > ale > > neprisel na to, jak donutit urllib2, aby s daty pracovala jako se > streamem > > (file-like objektem) a ne jako se stringem. Posledni napad je napsat si > > 'string-like object', ktery bude doopravdy soubor a nemapovat cely jeho > > obsah na pamet (jako dela mmap), ale seekovat a nejak to cist do bufferu. > > Prijde mi ale dost divne, ze by neexistovalo jednodussi reseni. > > > > Soucasna implementace je nasledujici: > > > > from urllib2 import Request, urlopen > > > > @classmethod > > def _f2b(cls, f, size=None): > > ''' > > Map files into memory and act as buffer. > > ''' > > if isinstance(f, basestring): > > # No conversion needed > > return f > > elif getattr(f, 'fileno', None): > > # Map to memory > > if size == None: > > # When size is already known, skip this > > f.seek(0, os.SEEK_END) > > size = f.tell() > > f.seek(0) > > return mmap.mmap(f.fileno(), size) > > else: > > raise fs.errors.UnsupportedError("Cannot handle type %s" % > > type(f)) > > > > @classmethod > > def put(cls, path, data, size=None): > > class PutRequest(Request): > > def __init__(self, *args, **kwargs): > > self.get_method = lambda: 'PUT' > > Request.__init__(self, *args, **kwargs) > > > > data = cls._f2b(data, size=size) > > req = PutRequest(''.join([cls.webapi, path]), data, > > headers=cls.headers) > > return urlopen(req) > > > > > > Diky za kazdou radu. > > > > Marek > > > _______________________________________________ > Python mailing list > [email protected] > http://www.py.cz/mailman/listinfo/python >
_______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
