2013-01-24 14 views
19

Piszę stronę opartą na Django, ale muszę obsługiwać prosty plik tekstowy. Czy jest to właściwy sposób, umieszczając go w katalogu statycznym i ominąc Django?Jak mogę przesłać plik tekstowy z Django?

+0

Tak, jeśli plik jest zwykłym tekstem (bez zawartości dynamicznej), jest poprawny. –

Odpowiedz

26

Jeśli plik jest statyczny (nie jest generowany przez aplikację django), można go umieścić w katalogu statycznym.

Jeśli treść tego pliku jest generowana przez Django, możesz zwrócić go w HttpResponse pod numerem text/plain jako typ MIME.

content = 'any string generated by django' 
return HttpResponse(content, content_type='text/plain') 

Można także podać nazwę pliku przez ustawienie Content-Disposition odpowiedzi.

filename = "my-file.txt" 
content = 'any string generated by django' 
response = HttpResponse(content, content_type='text/plain') 
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) 
return response 
+2

['Istnieje przykład w dokumentacji plików PDF] (https://docs.djangoproject.com/en/dev/howto/outputting-pdf/), który pokazuje, jak ustawić typ MIME inny niż HTML na Django ' HttpResponse'. –

+0

Czy istnieje możliwość dodania konkretnej nazwy pliku do pliku wygenerowanego z treści @ cc? – chuseuiti

+0

@chuseuiti Tak, zaktualizowałem moją odpowiedź – luc

6

zgadzam się z @luc jednak inną alternatywą jest użycie X-Accel-Redirect nagłówek.

Wyobraź sobie, że musisz wyświetlać duże pliki chronione (musisz się zalogować, aby je wyświetlić). Jeśli umieścisz plik w katalogu statycznym, jego dostęp będzie otwarty i każdy będzie mógł go zobaczyć. Jeśli wyświetlasz go w Django, otwierając plik, a następnie go obsługując, jest za dużo IO, a Django używa więcej pamięci RAM, ponieważ musi załadować plik do pamięci RAM. Rozwiązaniem jest posiadanie widoku, który uwierzytelni użytkownika w bazie danych, jednak zamiast zwracania pliku, Django doda nagłówek X-Accel-Redirect do odpowiedzi. Teraz, odkąd Django jest za Nginxem, nginx zobaczy ten nagłówek, a następnie wyświetli chroniony plik statyczny. Jest to o wiele lepsze, ponieważ nginx jest znacznie lepszy i znacznie łatwiejszy w serwowaniu plików statycznych w porównaniu do Django. Here są dokumentacje nginx, jak to zrobić. Możesz też zrobić coś podobnego w Apache, ale nie pamiętam nagłówka.

+0

Ciekawa odpowiedź. Dzięki – luc

3

Podobny wymóg dotyczył uzyskania szablonu tekstowego dla formularza za pośrednictwem AJAX. I zdecydować się na wprowadzenie go z myślą model oparty Django (1.6.1) tak:

from django.http import HttpResponse 
from django.views.generic import View 
from django.views.generic.detail import SingleObjectMixin 

from .models import MyModel 

class TextFieldView(SingleObjectMixin, View): 
    model = MyModel 

    def get(self, request, *args, **kwargs): 
     myinstance = self.get_object() 
     content = myinstance.render_text_content() 
     return HttpResponse(content, content_type='text/plain; charset=utf8') 

wytopione tekst jest dość mała i dynamicznie generowane z innych dziedzin w modelu.

+0

Dobre rozwiązanie i świetny sposób na kontrolowanie różnych typów plików. Czy masz przykład wpisu 'url_patten', aby go wywołać? – nehemiah

+0

Mam ten wzorzec w jednym z moich plików url.py: 'url (r '^ showfile/(? P \ d +)/$', TextFieldView, name = 'showfile')' – jandd

Powiązane problemy