• Как повысить свои навыки в построении архитектуры сложных приложений?

    bingo347
    @bingo347
    Crazy on performance...
    Если по теории, то мне в свое время вот эта книга помогла:
    https://www.litres.ru/robert-s-martin/chistaya-arh...

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

    Через несколько месяцев прочел еще раз, анализируя все затупы, что записал за это время в блокнот. После прочтения начал потихоньку рефакторить в существующих проектах места, которые уж очень жить мешали.

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

    Ну и недавно решил освежить память и перечитать еще раз. И на этот раз уже были мысли вроде "так если делать по другому, потом проблемы вылезут тут и тут".
    Ответ написан
    1 комментарий
  • Используете ли вы psycopg2 в проектах с Django Rest Framework?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега PostgreSQL
    Седой и строгий
    ORM его использует. А использовать его самому в Django проекте - это глупость, аннулирующая всю пользу от применения Django.
    Ответ написан
  • Как получить связанное поле в сериализаторе Django?

    @MEDIOFF
    Python Developer
    тык, тут приведены примеры разных реализаций, и полностью модель можете сериализовать и часть ее
    Ответ написан
    1 комментарий
  • Как получить связанное поле в сериализаторе Django?

    mgis
    @mgis Автор вопроса
    class ProductImagesSerializers(serializers.ModelSerializer):
        class Meta:
            model = ProductImage
            fields = '__all__'  
    
    
    class ProductListSerializer(serializers.ModelSerializer):
        images = ProductImagesSerializers(many = True, read_only = True)
        class Meta:
            model = Product
            fields = ['id', 'name', 'slug', 'price', 'category', 'images']
            read_only_fields = fields
    Ответ написан
    Комментировать
  • Vue3 почему не срабатывает реактивность?

    Djaler
    @Djaler
    Сеньор-помидор
    Ну, собственно, потому что оно и не должно. В location_id записывается исходное значение defaultLocation, и всё
    Ответ написан
    Комментировать
  • Альтернативные варианты реализации корзины в DRF?

    EtherDaler
    @EtherDaler
    Еще зеленый
    Создаете модель корзины, связываете ее с моделью пользователя. Потом создаете модель товары корзины и связываете ее с моделью корзины. Важно указать в ForeignKey полях аргумент related_name, чтобы можно было обращаться из родительской модели к дочерней.
    class Basket(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='basket')
    
    class BasketProducts(models.Model):
        basket= models.ForeignKey(Basket, on_delete=models.CASCADE, related_name='basket_products')
        products = models.ManyToManyField(Products, on_delete=models.CASCADE, related_name="basket_products")
    
    class Products(models.Model):
        name = models.CharField(max_length=255)
       '''''

    Потом сериализируете модели
    class ProductsSerializer(serializers.ModelSerializer):
        class Meta:
            model = Products
            fields = ("__all__")
    
    
    class BsketProductsSerializer(serializers.HyperlinkedModelSerializer):
        products = ProductsSerializer(many=True)
        class Meta:
            model = BasketProducts
            fields = ('basket','products')
    
    class BasketSerializer(serializers.HyperlinkedModelSerializer):
        basket_products = BsketProductsSerializer(many=True)
        class Meta:
            model = Basket
            fields = ('user' , 'basket_products ')
    
    class UserSerializer(serializers.HyperlinkedModelSerializer):
        basket = BasketSerializer(many=True)
        class Meta:
            model = User
            fields = ('id', 'phone','email' ,'basket')


    Далее во вьюхе в вашей функции API указываете permission_class как isAuthenticated, потом получаете корзину пользователя командой request.user.basket . В запросе в хедере указываете Authorization и токен.
    Ответ написан
    Комментировать
  • Как организовать структуру хранения атрибутов?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Перестать заниматься дичью, например, и узнать что для поиска стоит использовать поисковые движки вроде elasticsearch. А хранить можно и реляционной базе в json
    Ответ написан
    2 комментария
  • Как правильно оценивать сроки на разработку сайта в web студии?

    @DariaSSS
    Я говорила так, неделю беру на просмотр объема работы и выявления того с чем непосредственно работать. Если затруднений не вызовет и все хорошо справлюсь за неделю, если нет - отпишу через неделю сколько еще понадобится времени, по другому никак.
    Ответ написан
    Комментировать
  • Как правильно оценивать сроки на разработку сайта в web студии?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    «В молодости я спросил у начальника, как оценить время на выполнение работы? И начальник ответил мне:
    — Время, которое ты планируешь, умножить на Пи пополам, плюс 2 недели.
    — Почему Пи пополам? — удивился я.
    — Потому что в реальной жизни ты никогда не будешь двигаться к своей цели напрямую, а скорее — по дуге окружности.
    — А почему плюс две недели?
    — А потому, что когда ты в итоге просрёшь все сроки, то за две недели хоть что-то успеешь сделать.» (с)
    Ответ написан
    1 комментарий
  • Как правильно внедрять БЭМ?

    @AlexS94
    Попытаюсь ответить вам по пунктам, так как сам в своё время задавался теми же вопросами.

    1. Если говорить об удобстве - читаемость хромает, но на прямую в разрез с методологией это не идёт. Если существует "оБЭМленый" Bootstrap и он ничем не уступает - используйте. Это по-настоящему продуманная и современная библиотека компонентов, соответствующая стандартам доступности. Отдельных соглашений на такие случаи не знаю.

    Для себя решил отказаться от Bootstrap, чтобы глаз нервно не дёргался, при взгляде на "винегрет" из разных именований. Компенсирую это разработкой библиотеки собственных компонентов, руководствуясь тем же Bootstrap и лучшими практиками.

    2. Касательно использования em: рекомендую ознакомиться с этой статьёй
    Пришло время попрощаться с единицей измерения px
    Для блоков отдельно назначать font-size в px не нужно. Попробуйте правильно использовать rem, взяв за константу, что он должен быть по умолчанию 16px. Если нужно будет - отвечу подробнее.

    Лично я использую em в медиа-выражениях и в случае крайней необходимости в блоках.

    3. В случае чистого БЭМ - создайте блок с одним шрифтом и другим и используйте его как микс.

    4. Если честно, стараться использовать готовые решения CMS можно, но я бы не рекомендовал. Когда работал с WP, всё время кастомизировал классы и вывод шаблона. На Битрикс с этим проще, можно даже собственный класс назначить для WISYWIG редактора.
    Вопрос в том можете ли вы себе позволить такую кастомизацию или нет. Если это требует сверх ресурсов - оно того не стоит.

    5. Я использую альтернативное именование, которое прижилось лучше всего в англоговорящих странах .block__element--modifier. На мой взгляд оно читаемее.

    Вообще для расширения "БЭМ кругозора" рекомендую ознакомиться с этими статьями
    More Transparent UI Code with Namespaces
    Battling BEM CSS: 10 Common Problems And How To Av...

    Я в своей работе на данный момент использую расширенный БЭМ, так называемый BEMIT (BEM + ITCSS). Для обычных сайтов - этого хватает с головой, в случае современного реактивного фронтенда требует обсуждения с командой и более глубоко понимания в проектировании АНБ (абсолютно независимый блок).

    Надеюсь, что смог вам помочь, так как сам на решение этих вопрос вопросов потратил продолжительное время.
    Ответ написан
    5 комментариев
  • Как можно сохранить пользователя у которого значение NOT NULL?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    Передать "Не NULL"
    Ответ написан
    Комментировать
  • Как сделать авторизацию на сайт при парсинге через requests?

    На коленке состряпал, вроде работает:
    import requests
    
    url = "https://login.dnevnik.ru/login/esia/karelia"
    #url на свой регион заменишь, там когда на сайте авторизуешься он отображается
    
    login = 'логин'
    password = 'пароль'
    session = requests.Session()
    get_cookies = session.get(url)
    captcha_id = get_cookies.cookies['dnevnik_sst'].split('|')[0]
    print(captcha_id)
    
    data = {
    	'exceededAttempts': False,
    	'login': login,
    	'password': password,
    	'Captcha.Id': captcha_id
    }
    
    response = session.post(url, data)

    Для всех операций используешь объект session, в нём будут сохранятся куки, и потом можно обращаться к страницам, как будто ты авторизованный, например так:
    my_class_html = session.get('https://schools.dnevnik.ru/class.aspx')
    
    schedule_html = session.get('https://schools.dnevnik.ru/homework.aspx')
    Ответ написан
    2 комментария
  • Как ограничть одновеменый доступ пользователям в Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем проблема? Просто при каждой авторизации инвалидируйте все предыдущие сессии.
    Ответ написан
    6 комментариев
  • Как определить входит ли определённый отрезок времени в другой?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете сравнивать даты целиком на больше и меньше не приводя к строке:
    current_date >= start_date and current_date <= end_date

    А еще можно воспользоваться спорным фирменным питоновским синтаксисом:
    start_date <= current_date <= end_date
    Если все эти переменные типа datetime, то всё будет как надо.
    Ответ написан
    Комментировать
  • Не взяли на работу из-за неправильно выполненного тестового задания, посмотрите?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Без придирок к стилистике, вы не выполнили собственно самое главное - в ТЗ несколько раз упоминается требование к надежности.
    А у вас - переименовали старый отчет, затем пишете новый отчет.

    А если сбойн? Старый уже переименован, новый еще не дописан? Где выполнение требования отказоустойчивости?
    Ответ написан
    2 комментария
  • Не взяли на работу из-за неправильно выполненного тестового задания, посмотрите?

    NeiroNx
    @NeiroNx
    Программист
    про PEP 8 вы не прочитали.
    https://pythonworld.ru/osnovy/pep-8-rukovodstvo-po...

    про except Exception вообще молчу - это "костыль", а нужна вменяемая обработка ошибок.
    Ответ написан
    1 комментарий
  • Не взяли на работу из-за неправильно выполненного тестового задания, посмотрите?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    Братан, индусский код, без обид

    1)
    TASKS_DIR = os.path.dirname(__file__) + '/tasks'
    тут os.path.join нужен ( + - еще можно поспорить, если б см. п 2 ты правильно заюзал)

    2)
    file_data = user['name'] + '<' + user['email'] + '> ' +\
            time.strftime('%d.%m.%Y %H:%M', time.localtime()) + '\n' +\
            user['company']['name'] + '\n\n'


    это пишется так
    file_data = f"{user['name']} < {user['email']} + >  {time.strftime('%d.%m.%Y %H:%M', time.localtime())} \n {user['company']['name']} \n\n"

    и вот так еще полубезобидно можно складывать путь из п1.

    3)
    except Exception as e:
         print(e, u'Не удалось получить задачи | get_http_error')

    есть такая вещь как ООП и паттерны, и там наружу тебе нужно передавать естестенную (читай систмную, сетевую, АПИ) ошибку, а не самодеятельность - ну нет прав на запись в твою создаваемую ДИР, что делать запустившему - код твой гадать? так он сразу увидит, что нет прав, апи кей не катит, нет роута и т.д.

    ну и , как понимаешь, весь блок коннекта к апи можно было обернуть одиним - какая разница где ошибка? ты ее выведешь, при общем неуспехе

    но ты стараешьтся, молодец - нет camel style по крайней мере (надеюсь, это осознанно? )
    Ответ написан
    Комментировать
  • Как быстро осуществлять нейминг css классов для разносортных секций?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Ну тут скорее не вопрос, а крик души, который можно поддержать.

    По делу: да, проблема есть, именовать на больших проектах сложно. Решений нет.
    Вернее, только те, которые вам кажутся "грязными", но других не завезли (и не завезут).
    И те, которые не относятся к разработке (вроде "дать люлей дизайнеру, который не понимает, как это всё работает, и лепит каждый элемент как попало")

    Тут просто надо несколько абстрагироваться и принять то, что абсолютно в любой объёмной системе, даже если её вдруг пишет один человек (что вряд ли), всегда есть место неочевидным вещам. Перфекционист внутри рыдает, но что делать.

    Откройте любое масштабное решение - чёрт ногу сломит, не так ли? И требуется немало времени, чтобы вникнуть. Потом вникаешь - и становится проще, но всё равно много нагромождено. А если выпасть из контекста на месяц - потом опять заново вникать. Это норма (картинка с Малышевой).

    Стоит просто выбрать для себя какой-то стиль и строго ему следовать. И расширять словарный запас, чтобы играть словами.

    Совмещение ваших пунктов 1 и 3 в одно - вполне здоровый стиль.
    Если секция, где всё очевидно: about, gallery, text-section, etc.
    Если контент неоднородный - именовать по смыслу (как в 3).

    Единственное что мог бы посоветовать - не смущаться добавлять новые компоненты, задавая им какой-то дополнительный неймспейс (contacts-header, contacts-about), а не пытаться всё упихать в один общий с помощью модификаторов - в поддержке будет проще.

    Просто размышления от прочитанного:
    1. Подходы 2 ("section-1", "section-2") и 4 (атомарщина) - в аду для таких "специалистов" стоит отдельный котёл. Ну вы и сами понимаете. Использовать нужно никогда.
    2. Инкапсуляция имён ничего не даёт в этом отношении, так как это придумано для элементов внутри блока (а с этим и концепция БЭМ хорошо справляется), глобально вам как разработчику всё равно нужно иметь понятное "корневое" название блока.

    Ещё можно поработать со своей головой, возможно, что такой крик души идёт от страха быть осуждённым. Браузеру-то всё равно, вы ему хоть .qwerty123 { ... } скормите - нормально отобразится.
    Понятные имена - для разработчиков, и надо понимать, что ни один толковый разработчик в вас камнем не бросит за то, что вы дали блоку имя .contacts-footer-call-to-action, если у вас этот самый .call-to-action в каждой секции настолько разный, что в один компонент не умещается.
    Иногда помогает, если есть прямой выход на клиента или ЛПР донести, что такой дизайн... Ну не самый лучший для поддержки, и обосновать почему.
    А чисто технически - решений нет, ну, вот такая работа, чё делать.
    Ответ написан
    2 комментария
  • Как вывести на странице поле базы данных с HTML разметкой?

    ArsenyMatytsyn
    @ArsenyMatytsyn
    Руководитель frontend направления, предприниматель
    {{ a.text | safe }}
    Ответ написан
    Комментировать
  • Зачем нужен reverse()?

    deepblack
    @deepblack Куратор тега Django
    reverse позволяет по имени вьюхи получить её url.

    from news import views
    
    path('archive/', views.archive, name='news-archive')


    from django.urls import reverse
    
    reverse('news-archive')


    get_absolute_url - позволяет получить канонический URL обьекта, при условии что этот метод определён.

    # Можно так:
    def get_absolute_url(self):
        return "/people/%i/" % self.id
    
    # Но лучше так:
    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('people.views.details', args=[str(self.id)])


    <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>


    Ну и в догонку:

    spoiler
    <!-- Так не надо делать -->
    <a href="/language/category/product/{{product.pk}}">Link</a>
    
    <!-- надо так -->
    <a href="{{product.get_absolute_url}}">Link</a>

    Ответ написан
    2 комментария