Я пытаюсь предоставить редирект на предварительно назначенный 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
.
Есть ли хорошая причина, почему я могу создать тестовый сценарий дляпроверить этот редирект?