Настройка nginx и Django для запросов диапазон байтов

Я строю веб-API с помощью и nginx и Django, что должен поддерживать запросы диапазона байтов.

В настоящее время, при оформлении заявки, такие как:

curl --header "Content-Type: application/json" 
     --header "Authorization: Token 8f25cd3bb5b43a5277f4237b1d1db0273dbe8f6a" 
     --request POST http://myurl/download/ 
     --header "Range: bytes=0-50" 
     -v

мой взгляд Джанго (класс MyFileAPI) называется, пользователь аутентифицирован, и правильный путь к файлу (/код/веб/приложение/функция user_id/user_info.пбф) извлекается. Однако, первые 50 байт из файла не возвращаются. Вместо этого я просто вижу ошибку:

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.15.8</center>
</body>
</html>

Как мне настроить nginx, чтобы разрешить перенаправление на мой файл?

по умолчанию.конф

server {
    listen                  80;
    server_name             localhost;
    charset                 utf-8;
    client_max_body_size    10M;

    location /static/ {
        alias   /django_static/;
    }

    location / {
        include     uwsgi_params;
        uwsgi_pass  web:8000;

        add_header accept_ranges bytes;
    }

    location /myapp {
        root /code/web;
        add_header accept_ranges bytes;
        internal;
    }
}

с nginx.конф

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

views.py

class MyFileAPI(APIView):
    permission_classes = (IsAuthenticated,)

    def post(self, request):
        try:
            user = request.user
            my_file = MyFile.objects.filter(user_id=user).latest("created_date")

            # ex) my_file.filepath = /myapp/13/user_info.pbf
            # ex) my_files_path = /code/web/myapp/13/user_info.pbf
            my_files_path = settings.BASE_DIR + my_file.filepath

            response = HttpResponse(content_type="application/octet-stream", status=206)
            response['Accept-Ranges'] = 'bytes'
            response['X-Accel-Redirect'] = my_files_path
            response['X-Accel-Buffering'] = 'no'

            return response

        except Exception as e:
            return Response({'status': str(e)}, content_type="application/json")

Я знаю, что есть и другие посты на ту же тему, но никто дать полный ответ.

0
2019-09-18 16:38:03
источник
0 ответов

Посмотрите другие вопросы по меткам