Как реализовать защищенную загрузку файлов с запросами и аутентификацией в django - PullRequest
0 голосов
/ 18 октября 2019

У меня есть приложение django, куда я могу загружать файлы. Я показываю свои файлы в API. Вот так:

class FileCollection(models.Model):
    name = models.CharField(max_length=120, null=True, blank=True)
    store_file = models.FileField(upload_to=upload_file, null=True, blank=True)
    creation_date = models.DateTimeField(null=True, blank=True)

class FileDownloadAPIListView(ListAPIView):
    """Lists all files.

    """
    queryset = FileCollection.objects.all()
    serializer_class = FileCollectionSerializer

Позже я буду реализовывать различные запросы для получения конкретных файлов.

Я бы хотел загрузить эти файлы из скрипта, используя python, без необходимости открывать браузер или что-то подобное. Я хочу сделать аутентифицированный вызов API с запросами, который получает мой файл и затем сохраняет его на локальном компьютере.

Проблема в том, что мои файлы должны быть приватными, и только авторизованные пользователи могут иметь возможность загружать их. Для других моих API я использую аутентификацию токена JWT.

Мой вопрос сейчас: как мне это реализовать? Должен ли я

a) Сохранять свои файлы в S3 и выполнять API-вызов по этому URL, чтобы как-то аутентифицировать меня с моими учетными данными AWS? б) Сохраните мои файлы где-нибудь в моей базе данных PostgrSQL и получите все оттуда с помощью аутентифицированного вызова API с использованием JWT. c) третий вариант, который я не рассматривал

Кроме того, если бы я использовал a, b или c, как я мог бы реализовать их?

вариант a) я подумал, что это может быть что-то вроде:


def get_file(method='get'):

    headers = {
        "Authorization": "JWT " + token
    }

    url = 'http://localhost:8000/linktomyawsstorage'
    myfile = requests.get(url)
    open('/somefolder', 'wb').write(myfile.content)

    r = requests.request(method, ENDPOINT, headers=headers)

Но я не знаю, работает ли это, если мои файлы находятся в частном хранилище на AWS. Также я не знаю, так ли это нужно реализовывать.

Любые предложения, идеи, помощь или советы очень ценятся!

Заранее большое спасибо!

1 Ответ

1 голос
/ 18 октября 2019

Вы можете использовать предварительно назначенные URL-адреса S3. Сделайте так, чтобы ваши пользователи проходили аутентификацию в вашем приложении через пользовательский интерфейс. После аутентификации вы можете сгенерировать для них предварительно назначенные URL-адреса S3, которые они могут использовать для загрузки файла через браузер или через командную строку через curl / wget.

Ознакомьтесь с документацией AWS Python SDK по предварительно назначенным URL-адресам S3 .

Вы также можете просто использовать Python SDK, чтобы отправлять запросы к S3, чтобы получить объектыинтерес.

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