использование boto s3 с тестовым клиентом django для проверки перенаправления http на предварительно назначенный URL-адрес s3 - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь предоставить редирект на предварительно назначенный URL-адрес s3, сгенерированный через boto3, похоже, он должен работать, но я хочу написать для него тестовый пример.

Я проверил что-то похожее начто ниже.Сбой test_redirect_to_presigned_url() с test_bucket/testfile.png не найден.Хотя test_motos3_presigned_url работает как положено.

from django.test import TestCase
from django.test import Client


class MotoS3TestCase(TestCase):
    def setUp(self):
        self.mock = mock_s3()
        self.mock.start()
        self.bucket_name = 'test_bucket'
        self.conn = boto3.resource('s3')
        self.conn.create_bucket(Bucket=self.bucket_name)
        self.s3 = boto3.client('s3')

    def tearDown(self):
        self.mock.stop()

    def test_redirect_to_presigned_url(self):
        client = Client()
        response = client.get('/url/to/view/', follow=True)   
        self.assertTrue(response.status_code == 200, f'response: {response}, response.content: {response.content}')         

    def test_motos3_presigned_url(self):
        keyname = 'testfile.png'  
        self.s3.upload_fileobj(io.BytesIO(b'somefile content'), self.bucket_name, keyname)
        params = {
            'Bucket': self.bucket_name,
            'Key': keyname,
        }

        presigned_url = self.s3.generate_presigned_url(
            ClientMethod='get_object',
            Params=params,
            ExpiresIn=3600,
            HttpMethod='GET'
        )
        import requests
        response = requests.get(presigned_url)

        self.assertTrue(response.status_code == 200, f'response: {response}, response.content: {response.content}')

views.py

import boto3
from django.http import HttpResponseRedirect


def redirect_to_presigned_url(request):
    s3 = boto3.client('s3')
    keyname = 'testfile.png'  
    bucket_name = 'test_bucket'
    s3.upload_fileobj(io.BytesIO(b'somefile content'), bucket_name, keyname)
    params = {
                'Bucket': bucket_name,
                'Key': keyname,
    }

    presigned_url = s3.generate_presigned_url(
                ClientMethod='get_object',
                Params=params,
                ExpiresIn=3600,
                HttpMethod='GET'
    )
    return HttpResponseRedirect(redirect_to=presigned_url)

Похоже, что moto плохо интегрируется с тестовым клиентом django,При попытке перенаправления moto, кажется, возвращает 404 не существует.

Таким образом, даже несмотря на то, что я добавил объект, я не могу перенаправить на этот объект с помощью сгенерированного presigned_url.

Есть ли хорошая причина, почему я могу создать тестовый сценарий дляпроверить этот редирект?

...