Snippets

Mikhail Novikov тестовое задание

Created by Mikhail Novikov last modified

Суть проблемы

Существует ecommerce-фреймворк на основе django, который называется django-oscar.

Пример такого фреймворка можно посмотреть здесь http://getmybot-shop.herokuapp.com/catalogue/ (при первом открытии может грузиться долго, до минуты; это нормально, все последующие обновления страницы будут быстрыми.)

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

(это типичный separation of concerns: мы специально храним статику на одном сервере, а исполняемый код-на другом сервере).

Что нужно сделать:

  1. переопределить форму сохранения продукта и
  2. переопределить форму сохранения продуктовой категории,

чтобы картинки вместо сохранения на диск 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/) .

Подсказки

Что для этого нужно сделать:

  1. расширить аппу Oscar "Dashboard". Как это сделать: http://django-oscar.readthedocs.io/en/latest/topics/customisation.html#fork-the-oscar-app
  2. переопределить в этой аппе класс ProductCreateUpdateView, метод forms_valid(). Этот метод отвечает за сохранение нового продукта. В этом методе, после сохранения продукта, нужно найти картинки, которые к нему прицеплены, асинхронно выгрузить на Amazon S3 и подменить ссылки в БД.
  3. На всякий случай - вот самый простой способ запустить какую-то функцию асинхронно:
    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)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.