2016-01-21 7 views
2

Мне интересно, где лучше всего создать экземпляр boto3 s3-клиента, чтобы его можно было повторно использовать во время запроса в django.Где копировать клиент boto s3, чтобы он использовался повторно во время запроса?

У меня есть модель Django с вычисляемым свойством, которое возвращает подписанный s3 URL:

@property 
def url(self): 
    client = boto3.client('s3') 
    params = { 
     'Bucket': settings.BUCKET, 
     'Key': self.frame.s3_key, 
     'VersionId': self.key 
    } 
    return client.generate_presigned_url('get_object', Params=params) 

Объект сериализуется в JSON и возвращает список, который может содержать 100 из этих объектов.

Несмотря на то, что boto3.client('s3') не выполняет никаких сетевых запросов при создании экземпляра, я обнаружил, что он работает медленно.

Размещение S3_CLIENT = boto3.client('s3') в settings.py, а затем использование этого вместо создания экземпляра нового клиента на объект уменьшило время отклика на ~ 3X с 100 результатами. Тем не менее, я знаю, что неверно использовать глобальные переменные в settings.py

Мой вопрос заключается в том, где создать экземпляр этого клиента, чтобы его можно было повторно использовать, по крайней мере, на уровне запроса?

ответ

0

Мой лучший подход - использовать functools.partial и иметь все постоянные переменные, такие как ведро и другие метаданные, замороженные в частичном, а затем и pust pass в переменных данных. Тем не менее, boto3 все еще медленнее, чем ад, чтобы создать подписанные URL-адреса, по сравнению с простым строковым форматом он ~ x100 медленнее.