Copy
Как сделать лучшую корзину и всё успеть
View this email in your browser

Привет тебе!

Не так страшны первые 90% работы над проектом,
как ещё оставшиеся 90% работы.
(на самом деле всё хорошо)


Почти все из вас приступили к самой главной части - реализации бизнес-логики, это почти финиш проекта, многие компоненты у вас уже готовы и значит можно сосредоточиться на особенностях работы с Django. У вас уже достаточно много материала по проектам, поэтому старайтесь поменьше придумывать новых требований, переверстывать дизайн и тратить время на что-то ещё. Займитесь только программированием, и всё успеете.

Так как многие забыли про контрольную точку и не было рассылки с напоминанием, то срок контрольной точки сдвинут, я буду считать концом срока сегодняшний день (20 мая). При этом, напоминаю, что правила снижения оценок действуют максимально гуманно: учитываются только ваши задержки со сдачей, мои задержки с проверкой не учитываются, и вам не нужно переживать, если карточка больше суток висит в Verify без моих комментариев.

В этом письме: как лучше организовать свою работу, чтобы успеть доделать проект; как реализовать самую крутую современную корзины.


Не теряя времени с Django

Лишь некоторые из вас обратили внимание на такую особенность Django как огромное количество дополнительных модулей для любого случая. Этим нужно пользоваться, так как Django - это фреймворк. Фреймворк - это когда много всего готового, просто сделайте нужный import или pip install. И этот фреймворк позиционирует себя как инструмент для проектов с дедлайнами. Ваш дедлайн 23 июня, в этот день будут сданы ведомости с оценками.

Многообразие модулей конечно не предполагает, что нужно обязательно их использовать. Старайтесь оценить, насколько сложно сделать что-либо в вашем приложении и насколько эта функциональность может быть популярной. Прежде чем писать код, поищите, как люди в интернете решали подобную проблему. Необязательно принимать на веру их советы и также не рекомендуется пользоваться источниками старше, чем год (эту фильтрацию можно настроить в гугле). Если вы нашли подходящий модуль, то сначала изучите его инструкцию: есть много "универсальных" модулей, для которых придется писать кода больше, чем если бы вы попробовали решить свою задачу с нуля; также есть модули, настройки которых зашиты слишком глубоко, чтобы можно было легко реализовать то, что нужно именно вам.

Резюмируя:

  1. В Django уже есть много модулей. Для Django есть полно уроков. Просмотрите актуальные прежде чем начать писать код.
  2. Разберите несколько вариантов решений прежде чем окончательно выбирете подходящее вам или решите, что нужно реализовывать своё.

 

Как лучше организовать проектную работу

Хорошо организованная разработка подразумевает частый контакт между участниками. В ваших проектах два участника и важно, чтобы каждый был в курсе, что именно происходит с проектом и что в ближайших планах. Не стесняйтесь и не ленитесь создавать новые карточки в Trello, когда хотите заняться какой-то четко сформулированной задачей. Также, не лишним будет оповестить о своих планах ментора, чтобы он мог сэкономить ваше время, посоветовав, на что следует обратить внимание. Может возникнуть ситуация, когда вы возьметесь за то, что уже и так есть для Django. Старайтесь подробно логировать свои действия и дальнейшие планы. То, что собственные заметки очень часто помогают быстрее найти решение, я думаю, вы слышали. Но также эти заметки помогают ментору быть в курсе.

Резюмируя:

  1. Не используйте партизанское программирование, эта методология подходит опытным высокодисциплинированным разработчикам-интровертам.
  2. Используйте инструменты для ведения заметок о своей работе и коммуникации: Trello, git, email, slack.

 


Как сделать корзину

Далее речь пойдет о механизме и реализации корзины для тех, кто делает магазин или что-то похожее. Я хотел сначала предложить вам сделать очень простой механизм, реализация которого заняла бы около часа, но это был бы недостаточно хороший движок магазина. До сдачи проекта еще есть месяц, а корзина - это все-таки ключевой механизм онлайн-магазина. Остальные ключевые механизмы (каталог, авторизация и оплата) у вас уже реализованы почти у всех. Я предлагаю использовать возможность и сделать что-то стоящее, так как вы очень способные студенты в плане освоения чего-либо нового (это на самом деле так, хотя и просто мое личное мнение).

Анализируйте свои требования к проекту и решайте, в какой мере вы будете реализовывать корзину у себя. Нестрашно, если понадобится доработать схемы и модели. Я постараюсь дать максимально подробную инструкцию, а вы, если что-то не поймете или столкнетесь с долго не решаемой ошибкой - незамедлительно дайте мне знать.

Итак, по-настоящему хорошая корзина обладает следующими свойствами:

  • Ссылка на корзину должна быть доступна со всех страниц сайта. И более того, пользователь должен иметь возможность быстро просмотреть сумму покупок и товары в корзине (обычно это делается в выпадающем меню при наведении на значок корзины и Ajax-запросом, чтобы не подгружать каждый раз корзину целиком).
  • Неавторизованные пользователи должны иметь возможность добавлять товары в корзину. Их можно попросить авторизоваться, когда дело дойдет до оформления заказа, но не раньше.
  • После авторизации корзина привязывается к пользователю и может быть заполнена далее на другом устройстве, если ее еще не начали заполнять заново. Большинство магазинов, к сожалению, не умеет так, но почти у всех пользователей есть более одного постоянно используемого устройства. Почему бы не сделать возможность дооформить заказ с телефона или наоборот - с ноутбука?

Как некоторые из вас выяснили, корзины могут быть связаны с механизмом сессий. Это не совсем точно. На самом деле корзины обычно хранятся всё же в базе, но для неавторизованных пользователей они связаны токеном, хранящимся в cookies. Это связано с двумя ограничениями. Сессии должна постоянно поддерживать соединение сервера с клиентом, этот механизм плохо масштабируется. Куки - это просто файл на машине клиента, к которому имеет доступ ваш сайт - это решение никак не нагружает сервер. Но клиент не может хранить большой объем кук, как правило, есть ограничение в 20 переменных размером не более 4кб. Хотя 80кб хватит каждому покупателю хотя бы на список из ID и количество товаров, обычно информация о незавершенных заказах важна (больше данных для рекомендательных систем, например), поэтому у клиента лучше хранить только токен, по которому магазин будет определять, что именно заказали с этого компьютера. Путаницы добавляет то, что в Django работа с cookies происходит через словарь request.session.


Как все будет работать

В случае, если на сайт зашел посетитель и у него в куках еще не установлен токен корзины, то можно ничего не делать. Но, если он нажал кнопку "Добавить в корзину" или перешел на страницу корзины, то следует создать корзину так:

  • создать соответствующий объект в базе
  • установить пользователю токен в куки.

Если пользователь что-то добавлял в корзину, а потом решил залогиниться, то корзина с его текущим токеном должна привязаться к пользователю.

Если пользователь что-то ранее добавлял в корзину с другого устройства, а потом с текущего начал добавлять заново, то после авторизации он должен получить свою новую корзину.

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

Эту схему проще всего реализовать множеством корзин, из которых выбирать как текущую ту, которая была добавлена в базу позже всего.

Механизм корзины будет состоять из следующих компонентов:

  1. Модель корзины (например, Cart) и модель, связующая корзину и добавленные товары (например, ProductCart). В связующей модели можно указать количество товара и итоговую цену за всё добавленное.
  2. Метод получения корзины. В зависимости от того, существует ли для данного пользователя корзина или установлен ли уже токен, приложение должно брать нужную корзину или создавать новую.
  3. Форма добавления продукта в корзину. У вас уже есть отправка Ajax-запроса и вы можете просто дописать ее обработчик. Опционально, но желательно использовать POST-запросы.
  4. Места, в которых будет корзина будет создаваться и привязываться к пользователю. Это лучше всего сделать в контроллерах, которые отвечают за логин/логаут и завершение оплаты.
  5. Место, где корзина будет помечаться, как оплаченная или неактивная. Для этого можно сделать флаг вроде archive и всю логику применять только для корзин с archive=False.

 

Модель корзины

В модель корзины нужно добавить token (подойдет CharField(max_lenght=40)) и сделайте функцию с генератором случайной строки, ее же можно указать в определении поля CharField(max_lenght=40, default=generate_token). Также можно добавить в корзину total_price, который сразу же установить по умолчанию в ноль.

В классе корзины также следует добавить метод добавления нового товара, который принимает объект товара и количество, которое нужно добавить. Этот метод вставляет или обновляет записи в связующей таблице (ProductCart) и обновляет total_price корзины в целом.


Метод получения корзины

Метод получения корзины понадобится примерно в двух местах: когда посетитель запросил страницу корзины и когда он он нажал кнопку "Добавить в корзину".

Этот метод лучше разместить во views.py и на вход он будет принимать request. Если пользователь авторизован request.user.is_authenticated(), то нужно выбрать среди его корзин последнюю Cart.objects.filter(user=request.user,archive=False).latest('date_added'), если такой корзины не нашлось, то создать ее. Если пользователь неавторизован, то следует проверить, установлен ли в request.session токен корзины, если нет, то создавайте корзину, если да, то выбирайте корзину по токену аналогично тому, как выбирали по пользователю.


Форма добавления продукта в корзину

Позволю себе просто поделиться с вами готовым JavaScript-кодом, так как отлаживать его скучно и долго. Я в итоге передаю идентификатор нажатой кнопки POST-запросом. При этом для Django важно получить еще и csrf_token (средство защиты от XSS-атак). Итоговый код выглядит так:

$(document).ready(function(){
          $.ajaxSetup({
            data: {csrfmiddlewaretoken: '{{ csrf_token }}' }
          });
          $( "button.add" ).click(function(){
            var current_button = $(this);
            $.ajax({
                url: "/add-to-cart/",
                type: "POST",
                data: {"item": $(this).attr('id')},
                success: function(data){
                  current_button.replaceWith( data );
                }
            });
           });
        });

В контроллере, которая обрабатывает форму вы можете обратиться к переменной item так: request.POST.get('item')[0]. Далее нужно вытащить из нее идентификатор и узнать, есть ли в базе товар с соответствующим ID. Если есть, то запустите метод добавления в корзину и верните HttpResponse("Added") из контроллера.


Где привязывать корзину

Корзина создается тогда, когда она понадобилась. Вы сделаете метод в духе get_or_create по описанной выше логике, который в любом случае вернет вам нужную корзину. Когда же пользователь успешно авторизуется (в моем предыдущем примере авторизации это контроллер account_profile), можно взять текущую корзину только по токену и привязать к ней пользователя.

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

Заархивировать корзину можно в случае, когда пришел успех об оплате через PayPal. В моем предыдущем примере этот контроллер называется paypal_success.

На этом описание логики работы корзины завершено. Я еще отдельно напишу о том, как сделать ее доступной на всех страницах с использованием Ajax и, возможно, RESTful API. Пока попробуйте реализовать корзину такой.

Несколько советов по удобству реализации:

  • Выведите в шаблон сайта или печатайте в логи сервера токен корзины. Это упростит отладку.
  • Также отладку упростит дебаггер PyCharm, пользуйтесь им чаще, чтобы понять, что именно и куда приходит.
  • Комментируйте, что делают различные методы. Даже если сейчас очевидно, что в них происходит, через месяц вам придется напрячься, чтобы понять, как же работает ваша корзина.
Успехов вам с корзиной! Пищите и приходите обсудить, если у вас что-то не получается. Или приходите похвастаться успехами - это тоже приемлемо.
Sincerely yours,
Ivan Savin

Want to change how you receive these emails?
You can update your preferences or unsubscribe from this list






This email was sent to <<Email Address>>
why did I get this?    unsubscribe from this list    update subscription preferences
HSE Projects · ул. Мясницкая, дом 20 · Москва 101000 · Russia

Email Marketing Powered by MailChimp