Подтвердить что ты не робот

Как я могу использовать текстовый файл из Django?

Я пишу веб-сайт, основанный на Django, но вам нужно предоставить простой текстовый файл. Правильно ли это так, поместив его в статический каталог и минуя Django?

4b9b3361

Ответ 1

Если файл является статическим (не генерируется приложением django), вы можете поместить его в статический каталог.

Если содержимое этого файла сгенерировано Django, вы можете вернуть его в HttpResponse с помощью text/plain в качестве mimetype.

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

Вы также можете указать имя файла, установив Content-Disposition ответа.

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

Я согласен с @luc, однако другой альтернативой является использование заголовка X-Accel-Redirect.

Представьте, что вы должны обслуживать большие защищенные (должны войти в систему, чтобы просмотреть) статические файлы. Если вы поместите файл в статический каталог, тогда он будет открыт, и любой может его просмотреть. Если вы обслуживаете его в Django, открывая файл, а затем обслуживая его, слишком много IO, и Django будет использовать больше ОЗУ, так как он должен загрузить файл в ОЗУ. Решение состоит в том, чтобы иметь представление, которое будет аутентифицировать пользователя в отношении базы данных, но вместо того, чтобы возвращать файл, Django добавит заголовок X-Accel-Redirect к нему. Теперь, когда Django находится за nginx, nginx увидит этот заголовок, и он будет обслуживать защищенный статический файл. Это намного лучше, потому что nginx намного лучше и очень быстро работает в статических файлах по сравнению с Django. Здесь находятся документы nginx о том, как это сделать. Вы также можете сделать аналогичную вещь в Apache, однако я не помню заголовок.

Ответ 3

У меня было аналогичное требование для получения текстового шаблона для формы через AJAX. Я решил реализовать его с помощью модельного представления (Django 1.6.1) следующим образом:

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

Полученный текст довольно мал и динамически генерируется из других полей в модели.