Snippets
Суть проблемы
Существует ecommerce-фреймворк на основе django, который называется django-oscar.
Пример такого фреймворка можно посмотреть здесь http://getmybot-shop.herokuapp.com/catalogue/ (при первом открытии может грузиться долго, до минуты; это нормально, все последующие обновления страницы будут быстрыми.)
Текущая проблема этого магазина - вернее, даже не магазина, а хостинга, - в том, что хостинг heroku не умеет сохранять загруженные на него медиафайлы. Поэтому, как видно из сайта, все картинки не работают.
(это типичный separation of concerns: мы специально храним статику на одном сервере, а исполняемый код-на другом сервере).
Что нужно сделать:
- переопределить форму сохранения продукта и
- переопределить форму сохранения продуктовой категории,
чтобы картинки вместо сохранения на диск heroku сохранялись на внешний хостинг Amazon S3 и потом корректно отображались на сайте, как из админского дашборда (http://getmybot-shop.herokuapp.com/dashboard/catalogue/), так и с клиентской части (http://getmybot-shop.herokuapp.com/catalogue/, http://getmybot-shop.herokuapp.com/catalogue/category/sport_1/) .
Подсказки
Что для этого нужно сделать:
- расширить аппу Oscar "Dashboard". Как это сделать: http://django-oscar.readthedocs.io/en/latest/topics/customisation.html#fork-the-oscar-app
- переопределить в этой аппе класс ProductCreateUpdateView, метод forms_valid(). Этот метод отвечает за сохранение нового продукта. В этом методе, после сохранения продукта, нужно найти картинки, которые к нему прицеплены, асинхронно выгрузить на Amazon S3 и подменить ссылки в БД.
- На всякий случай - вот самый простой способ запустить какую-то функцию асинхронно:
import threading
def blocking_func(arg1, arg2):
print('some blocking stuff')
print(arg1, arg2)
thread1 = threading.Thread(target=blocking_func, args=('aaa', 'bbb'))
thread1.start()
никакого Celery и пр. заводить не надо, пока что достаточно такого примитивного способа.
-
Структуру объектов "продукт" и "изображение продукта" можно найти в аппе Oscar "Catalogue" http://prnt.sc/cyq609 . Это должно помочь понять, какие поля БД нужно подменять.
-
То же самое нужно проделать с картинками продуктовых категорий. За сохранение и обновление категорий отвечают CategoryCreateView и CategoryUpdateView, нужно просто переопределить их form_valid().
-
Быстрые сниппеты для работы с Amazon:
import boto3
session = boto3.Session(
aws_access_key_id='---',
aws_secret_access_key='---',
)
s3 = session.resource('s3')
# проверка, есть ли у юзера права на все buckets
for bucket in s3.buckets.all():
print(bucket.name)
bucket = s3.Bucket('getmybotoscar')
# проверка, есть ли у юзера права на считывание всех файлов из нужного бакета
for obj in bucket.objects.all():
print(obj)
# пример фильтров по файлам
for obj in bucket.objects.filter(Prefix='Dev/').all():
print(obj)
# проверка, может ли юзер класть файлы в этот бакет
data = open('create_auth_msgs.py', 'rb')
bucket.put_object(Key='test.py', Body=data)
# проверка, может ли он считывать файлы из этого бакета
obj = s3.Object(bucket_name='getmybotoscar', key='test.py')
response = obj.get()
data = response['Body'].read()
print(data)
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.