Служите статическим файлам через представление в Django - PullRequest
2 голосов
/ 22 августа 2010

Я пишу приложение Django, которое позволяет вам загружать файл после выполнения некоторых требований (например, вы должны войти в систему). В противном случае файл должен быть недоступен.

Служить файлу через Apache не получится: я должен проверить в базе данных разрешения пользователя. Кроме того, у меня нет разрешения на изменение конфигурации Apache.

Итак, я хочу прочитать файл в Django, затем установить соответствующие заголовки и отправить его клиенту.

Я использовал информацию на этой странице в руководстве по Django для заголовков.

У меня есть следующий код:

#<- check persmissons here, continue if allowed ->

#read the pdf file
location = 'file.pdf'
file = open(location, 'r')
content = file.read()
file.close

#serve the file
response = HttpResponse(content, mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=filename.pdf'

return response

Однако загруженный файл кажется поврежденным: его нельзя открыть в Adobe Reader. Я думаю, что, возможно, это какая-то проблема с кодировкой, но я не могу понять это.

Любая помощь приветствуется:)

1 Ответ

4 голосов
/ 22 августа 2010

Вы должны open() файл в двоичном режиме (рассмотрим документы ).

Так же, как это:

file = open(location, 'rb')

Я не знаю, применимо ли это к вам (поскольку вам не разрешено изменять настройки вашего Apache), но я бы рекомендовал использовать Lighttpd + mod_secdownload по соображениям производительности. Это элегантное решение использует оптимизацию Lighttpd для предоставления статического контента при делегировании решений об авторизации третьей стороне (в вашем случае Django).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...