2013-01-24 12 views
19

Sto scrivendo un sito web basato su Django, ma ho bisogno di servire un semplice file di testo. È il modo corretto di farlo posizionandolo nella directory statica e bypassando Django?Come posso pubblicare un file di testo da Django?

+0

Sì, se il file è di testo semplice (nessun contenuto dinamico) è corretto. –

risposta

26

Se il file è statico (non generato dall'app django), è possibile inserirlo nella directory statica.

Se il contenuto di questo file è generato da Django, è possibile restituirlo in HttpResponse con text/plain come mimo.

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

Si può anche dare un nome al file impostando il Content-Disposition della risposta.

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

['C'è un esempio nella documentazione per i file PDF] (https://docs.djangoproject.com/en/dev/howto/outputting-pdf/), che mostra come impostare un mimetype non HTML su un Django ' HttpResponse'. –

+0

Sarebbe possibile aggiungere un nome file specifico al file generato dal contenuto @luc ?? – chuseuiti

+0

@chuseuiti Sì, ho aggiornato la mia risposta – luc

6

Sono d'accordo con @luc però un'altra alternativa è di usare X-Accel-Redirect intestazione.

Immaginate di dover servire file statici protetti grandi (devono accedere per visualizzarli). Se inserisci il file nella directory statica, l'accesso è aperto e chiunque può visualizzarlo. Se lo servi in ​​Django aprendo il file e poi servendolo, c'è troppo IO e Django userà più RAM dato che deve caricare il file nella RAM. La soluzione è avere una vista, che autentificherà un utente contro un database, tuttavia invece di restituire un file, Django aggiungerà l'intestazione X-Accel-Redirect alla sua risposta. Ora poiché Django è dietro a nginx, nginx vedrà questa intestazione e servirà il file statico protetto. Questo è molto meglio perché nginx è molto migliore e molto più fasullo nel servire file statici rispetto a Django. Here sono documenti di nginx su come farlo. Puoi anche fare una cosa simile in Apache, tuttavia non ricordo l'intestazione.

+0

Risposta interessante. Grazie – luc

3

Avevo un requisito simile per ottenere un modello di testo per un modulo tramite AJAX. Ho scelto per la sua attuazione, con una vista basata modello (Django 1.6.1) come questo:

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') 

Il testo reso è piuttosto piccola e generati dinamicamente da altri campi del modello.

+0

Buona soluzione e ottimo modo per avere il controllo su vari tipi di file. Hai una voce di esempio "url_patten' per invocare questo? – nehemiah

+0

Ho questo schema in uno dei miei file url.py: 'url (r '^ showfile/(? P \ d +)/$', TextFieldView, name = 'showfile')' – jandd

Problemi correlati