пользовательские HTTP-заголовки для статических файлов с Django

Существует обычная разница между указателем на константу и указателем на константу. Сделав свой constexpr char*, вы сами сделали указатель constexpr (и, конечно, const), но он все еще пытается указать на неконстантный символ - и это неправильно, так как строковые литералы const , Решение:

constexpr const char* ch = "StackOverflow!";

, который объявляет указатель constexpr на const.

9
задан Javier 4 November 2008 в 19:36
поделиться

3 ответа

Если Ваше django приложение проксируется nginx, можно использовать x-accell-redirect. Необходимо передать специальный заголовок в ответе, nginx будет intercepet это и начинать служить файлу, можно также передать Довольное Расположение в том же ответе для принуждения загрузки.

То решение хорошо, если Вы хотите управлять, какие пользователи получают доступ к этим файлам.

Можно также использовать конфигурацию как это:

    #files which need to be forced downloads
    location /static/high_res/ {
        root /project_root;

        #don't ever send $request_filename in your response, it will expose your dir struct, use a quick regex hack to find just the filename
        if ($request_filename ~* ^.*?/([^/]*?)$) {
            set $filename $1;
        }

        #match images
        if ($filename ~* ^.*?\.((jpg)|(png)|(gif))$) {
            add_header Content-Disposition "attachment; filename=$filename";
        }
    }

    location /static {
        root /project_root;
    }

Это вызовет загрузку на всех изображениях в некоторой high_res папке (MEDIAROOT/high_rest). И для других статических файлов это будет вести себя как нормальный. Обратите внимание на то, что это - измененный быстрый взлом, который работает на меня. Это может иметь последствия безопасности, так используйте его с предосторожностью.

10
ответ дан 4 December 2019 в 14:32
поделиться

Я записал простому декоратору для представления django.views.static.serve

Который работает на меня отлично.

def serve_download(view_func):
    def _wrapped_view_func(request, *args, **kwargs):
        response = view_func(request, *args, **kwargs)
        response['Content-Type'] = 'application/octet-stream';
        import os.path
        response['Content-Disposition'] = 'attachment; filename="%s"' % os.path.basename(kwargs['path'])
        return response
    return _wrapped_view_func

Также можно играть с nginx типами пантомимы

http://wiki.codemongers.com/NginxHttpCoreModule#types

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

4
ответ дан 4 December 2019 в 14:32
поделиться

Что я делаю, теперь должен использовать другой URL для загрузки, чем для 'представлений' и добавить имя файла как аргумент URL:

обычная ссылка медиа: http://xx.com/media/images/lores/f_123123.jpg ссылка на загрузку: http://xx.com/downs/hires/f_12323?beach008.jpg

и nginx имеет конфигурацию как это:

    location /downs/ {
        root   /var/www/nginx-attachment;
        add_header Content-Disposition 'attachment; filename="$args"';
    }

но мне действительно не нравится запах этого.

0
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: