Wpis z mikrobloga

Jak to jest z pobieraniem (a raczej wysyłaniem do klienta) pliku w Django? Jest return serve, ale w większości przykładów znajduję informacje, żeby tego nie stosować na serwerach produkcyjnych. Dlaczego? Polecają wszędzie użycie funkcji webservera do tego, ale żeby to było skalowalne to też chyba kiepsko, bo trzeba pisać odpowiednie funkcje oddzielnie dla nginxa, apache, lighttp, litespeeda, etc?
Dodatkowe pytanie: jeśli nie chcę by użytkownik mógł poznać bezpośredni link do pobieranego pliku na serwerze (a więc żeby nie mógł potem sobie po prostu bezposrednio wejsc w link do zasobu na serwerze, pomijając aplikację), to wystarczy właśnie dać xsendfile czy inną funkcję webserverową, czy serve to też załatwi?
#programowanie #django
  • 4
  • Odpowiedz
@drakerc: afaik webservery optymalizuje się pod zwracanie plików statycznych - może z takiego mechanizmu keszowania da się łatwo skorzystać w Django? i jasne, zależeć to będzie od konkretnej serwera. tylko dlaczego zakładasz, że musisz pisać pod każdego? zdefiniuj interfejs ogólny, napisz specjalizację pod jeden, który obecnie używasz i e voila
  • Odpowiedz
Sto lat po fakcie, ale w/e

Jest return serve, ale w większości przykładów znajduję informacje, żeby tego nie stosować na serwerach produkcyjnych. Dlaczego?


@drakerc: Masz limit połączeń HTTP które w danej chwili może sensownie obsłużyć Django. W 99% nawet niski limit nie jest problemem, bo pojedyncze połączenia trwają ułamki sekundy. Kiedy wysyłasz userowi plik przez Django, tworzysz połączenie które może trwać bardzo długo. Jeśli pobieranie plików jest "standardową funkcją" twojej aplikacji,
  • Odpowiedz
@Riess: dzięki wielkie za wytłumaczenie.
Mam jeszcze jedno pytanie. Planowalem zrobić funkcję umożliwiającą pobieranie kilku plików "naraz", a więc user wybiera pliki, a Django/server kompresuje je do zipa / tar.gz czy inne archiwum. Nie jestem pewien jakoś co do tego też. Pewnie trzeba zrobić funkcję zipującą pliki (ZipFile + InMemoryUploadedFile?). Tylko kwestia która mnie zastanawiała, co jeżeli te zipowane pliki będą dość duże? Załóżmy że na serwerze mam 4GB RAMu +
  • Odpowiedz
@drakerc jeśli to ma być tylko pobieranie kilku plików jako jeden, to bym wyłączył kompresję i tylko archiwizował te pliki do jednego + zapisanie gotowej paczki na później.

Nie jestem też pewien ale zobaczyłbym też czy wywołanie programu zip przez subprocess.call() nie byłoby szybsze, ale tutaj wracamy do tematu zapychania wątku HTTP połączeniami.

Imho taka kompresja powinna działać na innym wątku via np. celery a frontend wyświetlał by tylko userowi JS'a który
  • Odpowiedz