Nginx+django проблем отдачи приватных статик-файлов

Есть такая задача для процесса разработки (еще не деплой):
При переходе по ссылке, допустим 127.0.0.1:8000/servefile/%id%, необходимо отдать файл/ссылку с фс (для скачивани или же для аудио-плеера soundmanager2), но прежде чем отдать респонс, надо проверить что пользователь имеет доступ файлику (т.е. что бы не мог обращаться к чужим файлам).
Я смотрю в сторону nginx и заголовков респонса X-Accel-Redirect. На данном этапе я не хочу использовать встроенный в джангу веб-сервер (runserver), дабы было проще отлаживаться.
Как правильно организовать такой доступ (gett url -> django view -> nginx static serve)? Через response-redirect?
Пока пытаюсь использовать вот такую конструкцию:
view:
def get(self, request, *args, **kwargs):
        audio_file = self.get_object()
        ogg_file_version = audio_file.audiofileversion_set.filter(format="ogg")
        if ogg_file_version.exists():
            ogg_file_version = ogg_file_version[0]
            res = HttpResponse()
            res["Content-type"] = "audio/ogg"
            res["X-Accel-Redirect"] = ogg_file_version.file.path
            res["Content-length"] = ogg_file_version.file.size
            return res
        return Http404()


Конфиг nginx:

server {

        listen 80;
        gzip off;
        expires off;

        location /static/ {
            add_header X-Static hit;
            autoindex on;
            expires off;
            root /Users/andrewshkovskii/workspace/ip_pbx/;
        }

        location / {
            proxy_pass       http://localhost:8000;
            rewrite ^/audiofiles/get/(\d+)/ /audiofiles/serve/$1/ last;
        }

        location /media/audio {
            internal;
            root   /var/ip_pbx/users;
        }
    }



Но пока что получаю 404. В какую сторону копать?
Спасибо за внимание.
  • Вопрос задан
  • 5040 просмотров
Решения вопроса 1
@andrewshkovskii Автор вопроса
Решено конфигом
    server {

        listen 80;
        gzip off;
        expires off;
        error_log /usr/local/Cellar/nginx/1.2.5/logs/error.log debug;

        location /static/ {
            add_header X-Static hit;
            autoindex on;
            expires off;
            root /Users/andrewshkovskii/workspace/ip_pbx/;
        }

        location / {
            proxy_pass       http://localhost:8000;
            rewrite ^/audiofiles/get/(\d+)/ /audiofiles/serve/$1/ last;
        }

        location ~ /var/ip_pbx/users_andrewshkovskii/(\d+)/(audio|calls)/(.*) {
            internal;
            root   /;
        }
    }



Т.е. надо было задать правильный re для локейшена с файлами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
MechanisM
@MechanisM
Я для таких целей как-то подключал приложение django-sendfile
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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