Данный декоратор обеспечивает выдачу пользователю файла с правильным указанием MIME типа и имени файла:
from django.http import HttpResponse, HttpResponseRedirect
def save_file(mimetype):
def saver(func):
def wrapper(request, *args, **kw):
result = func(request, *args, **kw)
if isinstance(result, tuple):
filename, data = result
resp = HttpResponse(data, mimetype=mimetype)
resp['Content-Disposition'] = 'attachment; filename=%s' % filename
return resp
return result
return wrapper
return saver
Пример использования:
@save_file('application/xml') # здесь указываем MIME тип файла
def xml_response(request):
""" Отдаём результат в формате XML. """
try:
# Допустим, что генерация XML производится внешней функцией
xml = "<resp><code>200</code><desc>Ok</desc></resp>"
except Exception, e:
# В случае ошибки, перенаправляем на соответствующую часть сайта
request.session['error'] = e
return HttpResponseRedirect('/error/')
return ('result.xml', xml) # здесь указываем его имя и содержимое
Декоратор корректно обработает ситуацию, когда декорируемая функция возвращает не имя файла и его содержимое. Как видно из примера, функция может возвращать объект для перенаправления пользователя на страницу с ошибкой. Всё это будет обработано так как надо, беспокоиться об этом не стоит.