Я пишу веб-сайт, основанный на Django, но вам нужно предоставить простой текстовый файл. Правильно ли это так, поместив его в статический каталог и минуя Django?
Как я могу использовать текстовый файл из Django?
Ответ 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')
Полученный текст довольно мал и динамически генерируется из других полей в модели.