IT Блог

Документации и переводы

Статьи на технические темы

Отключить кэширование страницы для приложения django-cms

При создании своего кастомного приложения (apphook) в django-cms или при отображении карточки товара в django-shop может кэшироваться страница.

Я столкнулся с такой проблемой, когда мне нужно было после добавления товара в корзину отображать актуальные данные (увеличить счётчик товаров в корзине, вывести сообщение, что товар был добавлен в корзину и т. д.). Чтобы убрать кэш именно в этом месте, достаточно для классового представления (class-based view) ProductRetrieveView.as_view(), который отображает карточку товара, использовать never_cache:

myshop/urls/products.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.conf.urls import url
from django.views.decorators.cache import never_cache
from shop.views.catalog import AddToCartView, ProductRetrieveView...

Как заставить Django перезапускать сервер при изменении шаблона?

Команда django runserver умеет определять изменения python-файлов (файлов с расширением .py) и можно подумать, что эта команда не умеет перезапускаться при изменении шаблонов. На самом деле здесь другая тема. Во-первых, нет необходимости перезагружать сервер при изменении шаблонов. А во-вторых, мы не можем наблюдать изменения шаблонов, если они закэшированы.

По умолчанию, когда в settings.py переменная DEBUG имеет значение False, шаблоны рендерятся каждый раз при загрузке страницы.

Но, если у нас добавляются специфические загрузчики (loaders), например так:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(ROOT_DIR, 'templates'), ],
        'OPTIONS': {
            'loaders': [
                ('django.template.loaders.cached.Loader', [
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader',
                    'admin_tools.template_loaders.Loader',
                ]),
            ],...

nginx настройка дефолтной страницы

Если на вашем хостинге есть несколько сайтов, то рекомендуется установить дефолтную страницу, которая будет показываться, если какой-то сайт временно не работает (а точнее, если временно удалена/не используется конфигурация nginx для какого-то сайта):

http {
    ...
    include /etc/nginx/sites-enabled/*;

    # default virtual host
    server {
        listen 80 default;
        server_name localhost;
        deny all;

        # добавьте location / {...}, если хотите, чтобы открылась ваша определённая страница вместо стандартного показа ошибки "403 Fobidden"
        location / {
            root   html;
            index  index.html;
        }
    }
    ...
}

Обработка кода ошибки 6 в Вконтакте - Слишком много запросов в секунду

При работе с API в Контакте можно встретить следующий ответ:

{'error': 'Too many requests per second', 'error_code': 6}

Значение 6 ключа error_code говорит о том, что превышено допустимое количество обращений api в течение некоторого времени (обычно в течение секунды).

Обработать его можно достаточно легко, например:

import requests
import time


def get_vk_data(method, params, max_attempts=20):
    url = f'https://api.vk.com/method/{method}'
    attempt = 0
    while attempt < max_attempts:
        resp = requests.get(url, params=params)
        data = resp.json()

        if 'error' in data and data['error'].get('error_code') == 6:
            time.sleep(2)
            attempt += 1
            continue
        
        break

    return data

Другими словами, мы пытаемся получить ответ (в переменную data) до тех пор, пока...


Перевод тегов в taggit

Для перевода используется пакет parler.

Используйте дополнительное поле title. Не добавляйте перевод полю name для django-taggit, так как на поле name завязано много функциональности

from parler.models import TranslatableModel, TranslatedFields
from taggit.managers import TaggableManager from taggit.models import GenericTaggedItemBase, TagBase, ItemBase

class MyTag(TagBase, TranslatableModel):
    translations = TranslatedFields(
        title=models.CharField(_('Title'), max_length=100),
    )

    @permalink
    def get_absolute_url(self):
        return 'tag_page', (self.slug, )

    class Meta:
        ordering = ('name', )
        verbose_name = _('Tag')
        verbose_name_plural = _('Tags')


class MyTaggedItemBase(ItemBase):
    tag = models.ForeignKey(MyTag, related_name='tag_items', on_delete=models.CASCADE)

    class Meta:
        abstract = True

    @classmethod
    def tags_for(cls, model, instance=None, **extra_filters):
        kwargs = extra_filters or {}
        if instance is not None:
            kwargs.update({
                '%s__content_object'...

node grunt автоматическая компиляция scss

Очень кратка инструкция без пояснений по тому, как в автоматическом режиме компилировать файлы scss.

Если ещё не установили nodejs, то устанавливаем:

# взято с https://github.com/nodesource/distributions/blob/master/README.md
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs

или:

apt-get install node
apt-get install npm

После установки NodeJS нужно добавить ссылку на nodejs, так как в debian исполняемый файл называется nodejs (вместо node):

sudo ln -s /usr/bin/nodejs /usr/bin/node

Убедитесь, что установлены пакеты:

sudo apt-get install sass
sudo apt-get install ruby-compass

Создаём в корне проекта package.json:

{
  "name": "grunt-getting-started",
  "version": "0.1.0",
  "devDependencies": {
    "grunt"                    : ">= 0.4",
    "grunt-cli"                : ">= 0.1.6",...

Перерисовка диаграммы highcharts

Обычно графики highcharts автоматически перерисовываются при изменении размеров окна браузера, но бывают случаи, когда нужно принудительно перерисовать график.

Интуиция подсказывает, что нужно использовать метод .redraw(), но, увы, возможно, это не сработает (как это случилось у меня). Мне, к примеру, нужно было перерисовывать диаграмму после сворачивания левой панели меню. Когда сворачивается или разворачивается меню, то ширина div-а изменяется и нужно автоматически подстраивать графики под новую ширину.

Для перерисовки диаграмм highcharts используйте метод .reflow():

$('..close').on('click.chart', function () {  // вешаем событие click на кнопку сворачивания меню
    var $sb_chart = $('.sb_chart');
    $.each($sb_chart, function () {  // если у вас несколько графиков...

Авторизация пользователей через Google

Авторизация пользователей на своём сайте через Google осуществляется так же просто, как и в или . Возьмём для примера этот сайт vivazzi.pro.

Для начала нужно перейти на страницу и создать свой проект, нажав на знак "+":

Вписываем название проекта:

Далее переходим в "Учётные данные" (вкладка находится на левой боковой панели) и щёлкаем на "Создать учётные данные".

Через кнопку "Создать учётные данные" нам нужно добавить доступ OAuth, т. е. идентификатор клиента OAuth. Щёлкаем и видим сообщение о том, что нам нужно заполнить "Окно запроса доступа Oauth". Переходим по ссылке, и можно заполнить только поле "Название продукта, который видят пользователи":

Вот теперь...


Авторизация через социальную сеть Facebook

Рассмотрим авторизацию пользователей на своём сайте через социальную сеть Facebook на примере сайта vivazzi.pro.

Сперва мы должны зарегистрировать своё приложение в соц. сети Facebook на странице

Щёлкните "Добавьте новое приложение" и в форме впишите название вашего проекта. В моём случае: Vivazzi.

Перед нами откроется панель приложения:

Обратите внимание, что рядом с названием расположен незакрашенный круг с зелёной обводкой. Это говорит о том, что пока приложение находится в тестовом режиме. Чуть позже мы сделаем его доступным для всех, а пока продолжим настройку.

Теперь нужно добавить продукт "Вход через Facebook":

Выбираем платформу "Веб", если собираемся регистрировать пользователей на своём сайте. Далее откроется...


Django allauth авторизация через социальную сеть

Django-allauth замечательный пакет для авторизации пользователей на своём сайте, который берёт на себя рутинные операции по регистрации пользователей обычным способом через форму, а также через популярные социальные сети.

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

На данный момент приложение поддерживает более 60 соц....

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц